友元函数
友元函数在类里面声明,但是他更相当于一个全局函数
在类里public或者private 或者protected里面定义没有影响
友元函数可以在类外面访问类的私有变量
举个栗子
看一下使用方法
class Test { private: int private_i; friend int read_priv(Test &t,int i); //友元函数声明 public: Test(int i); }; Test::Test(int i) { this->private_i = i; } //友元函数定义 int read_priv(Test &t,int i) { t.private_i += i; //修改私有变量 return t.private_i; } int main(int argc, char const *argv[]) { Test test1(1); cout<<read_priv(test1,5)<<endl; }
声明友元函数:在函数前面加一个 friend 关键字,其余部分和普通函数一样
定义友元函数:完全和普通函数一样,不需要使用类的域符号
调用友元函数:和普通函数一样
友元类
class Test { private: int private_i; friend class Cakk; //Cakk为Test的友元类 friend int read_priv(Test &t,int i); //友元函数声明 public: Test(int i); }; Test::Test(int i) { this->private_i = i; } //友元函数定义 int read_priv(Test &t,int i) { t.private_i += i; //修改私有变量 return t.private_i; } //友元类 class Cakk { private: public: int read_test_priv(Test &testn) {
testn.private_i++; return testn.private_i; } }; int main(int argc, char const *argv[]) { Test test1(1); cout<<read_priv(test1,5)<<endl; Cakk cak; cout<<cak.read_test_priv(test1)<<endl; }
在基类 Test 里面声明了一个友元类 Cakk ,友元类里所有的函数都是友元函数,所以这个类里的函数可以修改基类私有值
友元关系是单向的,A是B的友元类,反过来B不一定是A的友元类
友元关系不能传递,A是B的友元类,C是A的友元类,C和B不一定会有什么关系。