作者:shaka14 | 来源:互联网 | 2024-12-24 17:44
在 C++ 中,友元机制允许某些特定的函数或类访问另一个类的私有和保护成员,尽管这会破坏对象的封装性。友元可以分为三种类型:外部函数友元、成员函数友元和类友元。
### 1. 外部函数友元
当需要让一个外部函数访问某个类的私有成员时,可以将该函数声明为友元函数。例如:
class Int { private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} friend void fun(Int &it); }; void fun(Int &it) { it.value = 10; }
需要注意的是,作为外部函数,它没有隐含的对象指针(即 this 指针),因此无法通过对象来讨论其可访问性。
### 2. 成员函数友元
如果希望一个类的成员函数能够访问另一个类的私有成员,可以通过声明成员函数友元实现。示例如下:
class Int; class Object { public: void fun(Int &it); }; class Int { private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} friend void Object::fun(Int &it); // 告诉编译器这是 Object 类的成员函数 }; void Object::fun(Int &it) { it.value = 100; } int main() { Object obj; Int a(0); obj.fun(a); return 0; }
这里的关键是必须明确指出哪个类的成员函数是友元。
### 3. 类友元
类友元允许一个类的所有成员函数访问另一个类的私有成员。例如:
class Int; class Object { public: void fun(Int &it); }; class Int { friend class Object; private: int value; public: Int(int x = 0) : value(x) {} ~Int() {} }; void Object::fun(Int &it) { it.value = 100; }
总结来说,友元具有以下特点:
- 单向性:只有被声明为友元的函数或类才能访问私有成员。
- 不传递性:即使 A 是 B 的友元,B 也不是 A 的友元。
- 不继承性:派生类不会自动继承基类的友元关系。