友元关系使用:
友元关系是类之间的一种特殊关系,这种关系不仅允许友元类访问对方的public方法和属性,
还允许友元类访问对方的protected和private方法和属性。
使用友元的好处是直接访问对象的私有数据,而不使用对象的方法,省去了函数的调用开销,进而提高执行效率。
但是,这样做破坏了类的封装和信息隐藏特性。
应用:
迭代器模式:friend class scIterator;
代码示例摘自:www.fishc.com
#include <iostream> #include <string> class Lovers { public: Lovers(std::string theName); void kiss(Lovers *lover); void ask(Lovers *lover,std::string something); protected: std::string name; friend class Others; //当类Others需要访问类Lover时,需在此处声明友元关系,而不能在别处 }; class Boyfriend:public Lovers //派生出来的子类 { public: Boyfriend(std::string theName); }; class Girlfriend:public Lovers { public: Girlfriend(std::string theName); }; class Others //不同Lover的类 { public: Others(std::string theName); void kiss(Lovers *lover); protected: std::string name; //friend class Lovers; }; //类Lovers相关属性和方法 Lovers::Lovers(std::string theName) { name=theName; } void Lovers::kiss(Lovers *lover) { std::cout<<name<<"亲亲我们家的"<<lover->name<<std::endl; } void Lovers::ask(Lovers *lover,std::string something)//用指针声明 { std::cout<<"宝贝儿"<<lover->name<<"帮我"<<something<<std::endl; } //派生出来的子类相关属性和方法 Boyfriend::Boyfriend(std::string theName):Lovers(theName) { } Girlfriend::Girlfriend(std::string theName):Lovers(theName) { } //类Others相关属性和方法 Others::Others(std::string theName) { name=theName; } void Others::kiss(Lovers *lover) { std::cout<<name<<"亲一下"<<lover->name<<std::endl; //需声明友元关系,才能使得Others访问lover.name } int main() { Boyfriend boyfriend("A 君"); //声明变量 Girlfriend girlfriend("B 妞"); Others others("路人甲"); girlfriend.kiss(&boyfriend);//传递地址 girlfriend.ask(&boyfriend,"洗衣服去啦"); std::cout<<"\n当当当当,路人甲登场啦!"<<std::endl; others.kiss(&girlfriend); return 0; } //执行结果: <pre name="code" class="cpp">//B 妞亲亲我们家的A 君 //宝贝儿A 君帮我洗衣服去啦 //当当当当,路人甲登场啦! //路人甲亲一下B 妞