private成员只限同个类别的其他成员存取, C++ 提供另一种方式让函数或其他类别也可存取private成员,就是在类别宣告为friend的成员函数,或是宣告为friend的类别,举例如下
#include <iostream>
class Demo {
public:
Demo(int pa, int pb) {
a = pa;
b = pb;
}
friend int do_something(Demo& d) {
return d.a + d.b;
}
friend class Demo2;
private:
int a;
int b;
};
class Demo2 {
public:
int do_something2(Demo& d) {
return d.a + d.b;
}
};
int main() {
Demo d(32, 22);
std::cout << do_something(d) << std::endl;
Demo2 d2;
std::cout << d2.do_something2(d) << std::endl;
return 0;
}
do_something()为宣告为friend的成员函数,注意,这里以Demo的参考当参数,至于Demo2为可存取Demo中private成员的类别
friend int do_something(Demo& d) {
return d.a + d.b;
}
Demo2的do_something2()以Demo的参考当参数,就可以存取Demo的private成员了
int do_something2(Demo& d) {
return d.a + d.b;
}
friend成员函数do_something()不需要以物件呼叫,Demo2的do_something2()则需要用Demo2的物件呼叫
Demo d(32, 22);
std::cout << do_something(d) << std::endl;
Demo2 d2;
std::cout << d2.do_something2(d) << std::endl;
编译执行,结果如下
$ g++ u0908.cpp
$./a.out 复制代码
54
54
$