C++ 友元
友元(friend)
机制允许某些函数或类访问另一个类的私有(private)和保护(protected)成员
。友元不是类的成员,但可以像成员一样访问类的私有数据。友元分为三种常见形式:全局函数做友元、友元类、成员函数做友元。
1. 全局函数做友元
• 在类内用friend声明某个全局函数为友元,该函数可以访问类的私有和保护成员。
示例:
class Box {
private:int length;
public:Box(int l) : length(l) {}friend void printLength(const Box& b); // 声明全局函数为友元
};void printLength(const Box& b) {std::cout << b.length << std::endl; // 可以访问私有成员
}
2. 友元类
• 在类内用friend class 类名;声明另一个类为友元类,该类的所有成员函数都可以访问本类的私有和保护成员。
示例:
class Engine; // 前向声明class Car {
private:int speed;
public:Car(int s) : speed(s) {}friend class Engine; // Engine是Car的友元类
};class Engine {
public:void showSpeed(const Car& c) {std::cout << c.speed << std::endl; // 可以访问Car的私有成员}
};
3. 成员函数做友元
• 可以只将另一个类的某个成员函数声明为友元,而不是整个类。
示例:
class Car; // 前向声明class Engine {
public:void showSpeed(const Car& c);
};class Car {
private:int speed;
public:Car(int s) : speed(s) {}friend void Engine::showSpeed(const Car& c); // 只授权Engine的showSpeed为友元
};void Engine::showSpeed(const Car& c) {std::cout << c.speed << std::endl; // 可以访问Car的私有成员
}
总结
• 友元机制打破了类的封装性
,应谨慎使用,只在确有需要时开放接口。
• 友元关系是单向的、不可传递
的。
• 友元可以是全局函数、类、或成员函数,灵活控制访问权限。