在 C++ 中,友元(friend) 是一种机制,允许某个类或函数访问另一个类的私有(private)和保护(protected)成员。友元可以是:
- 友元函数:一个普通函数或另一个类的成员函数。
- 友元类:一个类可以成为另一个类的友元,从而访问其私有和保护成员。
友元关系打破了类的封装性,因此应谨慎使用,通常用于需要紧密协作的类或函数之间。
友元函数
特点
- 友元函数是一个普通函数或另一个类的成员函数,但它可以访问类的私有和保护成员。
- 友元函数不是类的成员函数,因此没有
this指针。 - 友元函数需要在类内声明,并使用
friend关键字。
语法
class ClassName {
friend ReturnType FunctionName(Parameters); // 声明友元函数
};
示例
以下是一个友元函数的示例:
#include <iostream>
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {}
// 声明友元函数
friend void printData(const MyClass& obj);
};
// 定义友元函数
void printData(const MyClass& obj) {
std::cout << "Data: " << obj.data << std::endl; // 访问私有成员
}
int main() {
MyClass obj(42);
printData(obj); // 调用友元函数
return 0;
}
输出
Data: 42
解析
printData是一个普通函数,但它被声明为MyClass的友元函数,因此可以访问MyClass的私有成员data。
友元类
特点
- 一个类可以成为另一个类的友元,从而访问其私有和保护成员。
- 友元关系是单向的,不具有传递性(如果
A是B的友元,B不一定是A的友元)。 - 友元关系不能被继承。
语法
class ClassName {
friend class FriendClassName; // 声明友元类
};
示例
以下是一个友元类的示例:
#include <iostream>
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {}
// 声明友元类
friend class FriendClass;
};
class FriendClass {
public:
void printData(const MyClass& obj) {
std::cout << "Data: " << obj.data << std::endl; // 访问 MyClass 的私有成员
}
};
int main() {
MyClass obj(42);
FriendClass friendObj;
friendObj.printData(obj); // 调用友元类的成员函数
return 0;
}
输出
Data: 42
解析
FriendClass是MyClass的友元类,因此FriendClass的成员函数可以访问MyClass的私有成员data。
友元函数作为另一个类的成员函数
友元函数也可以是另一个类的成员函数。这种情况下,该成员函数可以访问声明它为友元的类的私有和保护成员。
示例
#include <iostream>
class MyClass; // 前向声明
class FriendClass {
public:
void printData(const MyClass& obj);
};
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {}
// 声明 FriendClass 的成员函数为友元函数
friend void FriendClass::printData(const MyClass& obj);
};
// 定义 FriendClass 的成员函数
void FriendClass::printData(const MyClass& obj) {
std::cout << "Data: " << obj.data << std::endl; // 访问 MyClass 的私有成员
}
int main() {
MyClass obj(42);
FriendClass friendObj;
friendObj.printData(obj); // 调用友元函数
return 0;
}
输出
Data: 42
解析
FriendClass::printData是MyClass的友元函数,因此它可以访问MyClass的私有成员data。
友元的注意事项
-
破坏封装性:
- 友元机制打破了类的封装性,因此应谨慎使用。
- 只有在确实需要访问私有成员时才使用友元。
-
单向性:
- 友元关系是单向的。如果
A是B的友元,B并不会自动成为A的友元。
- 友元关系是单向的。如果
-
不可继承:
- 友元关系不能被继承。如果
A是B的友元,A的派生类不会自动成为B的友元。
- 友元关系不能被继承。如果
-
不可传递:
- 友元关系不具有传递性。如果
A是B的友元,B是C的友元,A不会自动成为C的友元。
- 友元关系不具有传递性。如果
总结
- 友元函数:允许一个普通函数或另一个类的成员函数访问类的私有和保护成员。
- 友元类:允许一个类访问另一个类的私有和保护成员。
- 使用场景:当两个类或函数需要紧密协作时,可以使用友元机制。
- 注意事项:友元机制破坏了封装性,应谨慎使用。
1058

被折叠的 条评论
为什么被折叠?



