- C++基础
- C++主页
- C++概述
- C++环境设置
- C++基本语法
- C++注释
- C++ Hello World
- C++省略命名空间
- C++常量/字面量
- C++关键字
- C++标识符
- C++数据类型
- C++数值数据类型
- C++字符数据类型
- C++布尔数据类型
- C++变量类型
- C++变量作用域
- C++多个变量
- C++基本输入/输出
- C++修饰符类型
- C++存储类
- C++运算符
- C++数字
- C++枚举
- C++引用
- C++日期和时间
- C++控制语句
- C++决策制定
- C++ if 语句
- C++ if else 语句
- C++嵌套if语句
- C++ switch 语句
- C++嵌套switch语句
- C++循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++构造函数
- C++构造函数和析构函数
- C++复制构造函数
C++友元函数
C++友元函数
类的友元函数定义在类作用域之外,但它有权访问类的所有私有和保护成员。即使友元函数的原型出现在类定义中,友元也不是成员函数。
友元可以是函数、函数模板、成员函数或类或类模板,在这种情况下,整个类及其所有成员都是友元。
声明友元函数
要将函数声明为类的友元,请在类定义中使用关键字**friend**在函数原型之前:
语法
class Box {
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};
要将 ClassTwo 类的所有成员函数声明为 ClassOne 类的友元,请在 ClassOne 的定义中添加以下声明:
friend class ClassTwo;
友元函数示例
以下是 C++ 中友元函数的代码:
#include <iostream>
using namespace std;
class Box {
double width;
public:
friend void printWidth( Box box );
void setWidth( double wid );
};
// Member function definition
void Box::setWidth( double wid ) {
width = wid;
}
// Note: printWidth() is not a member function of any class.
void printWidth( Box box ) {
/* Because printWidth() is a friend of Box, it can
directly access any member of this class */
cout << "Width of box : " << box.width <<endl;
}
// Main function for the program
int main() {
Box box;
// set box width without member function
box.setWidth(10.0);
// Use friend function to print the wdith.
printWidth( box );
return 0;
}
编译并运行上述代码后,将产生以下结果:
Width of box : 10
访问私有和保护成员
类的私有和保护成员在类外部是不可访问的。但是,如果要访问它们,可以使用友元函数。友元函数提供了直接访问类私有和保护成员的能力。
示例
以下示例演示了使用友元函数访问类的私有和保护成员。
#include <iostream>
using namespace std;
class ClassName {
private:
int privateData; // Private member
protected:
int protectedData; // Protected member
public:
ClassName() : privateData(0), protectedData(0) {}
// Declare a friend function
friend void friendFunction(ClassName& obj);
};
// Friend function definition
void friendFunction(ClassName& obj) {
obj.privateData = 42; // Access private member
obj.protectedData = 24; // Access protected member
cout << "Private Data: " << obj.privateData << endl;
cout << "Protected Data: " << obj.protectedData << endl;
}
int main() {
ClassName obj;
friendFunction(obj); // Call the friend function
return 0;
}
编译并运行上述代码后,将产生以下结果:
Private Data: 42 Protected Data: 24
友元函数与成员函数
在 C++ 中,友元函数和成员函数都用于访问和操作类的成员数据,但是它们在作用域和用法上存在显著差异。
友元函数
友元函数是非成员函数,它在类内使用“friend”关键字声明,它可以特殊访问类的私有和保护成员。由于它不是成员函数,因此它不绑定到特定对象,不能根据对象重载,不能使用this指针,也不能被派生类继承。它们定义在类之外,但在类内声明。
成员函数
而成员函数定义在类内,并使用 this 指针操作。它可以访问类的所有成员(私有、保护和公有),并且因为它与类对象绑定,所以它可以被重载和被派生类继承。
友元类
在 C++ 中,友元类是可以访问另一个类私有和保护成员的类。当一个类声明另一个类为友元时,第二个类(友元)可以直接访问第一个类的私有和保护成员。
这个概念类似于友元函数,但这里友元是整个类而不是特定函数。
语法
以下是 C++ 中友元类的语法:
class ClassB; // Forward declaration of ClassB
class ClassA {
private:
int dataA;
public:
// Declare ClassB as a friend of ClassA
friend class ClassB;
};
Example
The following example demonstrates the example of a friend class in C++:
#include <iostream>
using namespace std;
class ClassB; // Forward declaration of ClassB
class ClassA {
private:
int dataA;
public:
ClassA() : dataA(42) {} // Initialize dataA with a value
// Declare ClassB as a friend of ClassA
friend class ClassB;
};
class ClassB {
public:
void showDataFromA(const ClassA& objA) {
// Access private member of ClassA
cout << "Data from ClassA: " << objA.dataA << endl;
}
};
int main() {
ClassA objA;
ClassB objB;
// Use ClassB to access ClassA's private data
objB.showDataFromA(objA);
return 0;
}
Advertisements