定义:类的特点是私有成员无法在作用域外访问,而友元函数是特权函数,允许访问私有成员。
语法:在函数或类前加friend。
例子:在message中,published每个人都可访问,secret只有自己可以访问。但有时也需要秘密接头人访问secret。
注意事项:
1.友元关系不能被继承。
2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友
#includeusing namespace std; class message { private: string secret; public: string published; public: message(string _secret, string _published) { secret = _secret; published = _published; } private: friend void visiting(message &m) { cout <<"secret: "<< m.secret << endl; cout << "published: " << m.published << endl; } }; int main() { message paper("aaa","bbb"); visiting(paper); }
#includeusing namespace std; class massege; //需要引用的类要在前面声明 class spy { public: void visiting_1(massege& paper);//不做为友元 void visiting_2(massege& paper);//做为友元 }; class massege { public: string publishing; private: string secret; public: massege(string _publishing, string _secret) { publishing = _publishing; secret = _secret; } private: friend void spy::visiting_2(massege &paper); }; void spy::visiting_1(massege& paper) { cout << "visiting_1 publishing:" << paper.publishing << endl; cout << "visiting_1 can't visit secret!" << endl; } void spy::visiting_2(massege& paper) { cout << "visiting_2 publishing:" << paper.publishing << endl; cout << "visiting_2 secret:" << paper.secret << endl; } int main() { massege paper("ppppp","sssss"); spy YY; YY.visiting_1(paper); YY.visiting_2(paper); }
#includeusing namespace std; class massege; //需要引用的类要在前面声明 class spy { public: void visiting_1(massege& paper);//不做为友元 void visiting_2(massege& paper);//做为友元 }; class massege { public: string publishing; private: string secret; public: massege(string _publishing, string _secret) { publishing = _publishing; secret = _secret; } private: friend spy; }; void spy::visiting_1(massege& paper) { cout << "visiting_1 publishing:" << paper.publishing << endl; cout << "visiting_2 secret:" << paper.secret << endl; } void spy::visiting_2(massege& paper) { cout << "visiting_2 publishing:" << paper.publishing << endl; cout << "visiting_2 secret:" << paper.secret << endl; } int main() { massege paper("ppppp","sssss"); spy YY; YY.visiting_1(paper); YY.visiting_2(paper); }