- 全局函数的友元声明的作用是影响访问权限,也就是该全局函数可以访问类内私有的成员属性,但是友元的声明起不到普通声明的作用,也就是定义出现在使用后面必须得另外声明,光靠友元声明是不行的。
1 class Person 2 { 3 friend void fun(); 4 public: 5 Person(string name, int age) :name_(name), age_(age) 6 { 7 fun(); 8 } 9 private: 10 string name_; 11 int age_; 12 }; 13 void fun() 14 { 15 cout << "Person类的友元" << endl; 16 }
1 class Person 2 { 3 friend void fun(); 4 void fun(); 5 public: 6 Person(string name, int age) :name_(name), age_(age) 7 { 8 fun(); 9 } 10 private: 11 string name_; 12 int age_; 13 }; 14 void fun() 15 { 16 cout << "Person类的友元" << endl; 17 }
此时这个代码就不会报错。
- 如果在类内声明了这个全局函数函数,那么类外如果想在定义之前使用这个全局函数的话,必须重新声明。
1 class Person 2 { 3 friend void fun(); 4 void fun(); 5 public: 6 Person(string name, int age) :name_(name), age_(age) 7 { 8 fun(); 9 } 10 private: 11 string name_; 12 int age_; 13 }; 14 15 void func() 16 { 17 fun(); 18 } 19 void fun() 20 { 21 cout << "Person类的友元" << endl; 22 }
- 包括在类内定义这个友元也有上述相同的规则
1 class Person 2 { 3 friend void fun() 4 { 5 cout << "Person类的友元" << endl; 6 } 7 void fun(); 8 public: 9 Person(string name, int age) :name_(name), age_(age) 10 { 11 fun();//这个程序是错的,如果友元在类内定义,成员函数不能使用该友元 12 } 13 private: 14 string name_; 15 int age_; 16 };
1 class Person 2 { 3 friend void fun() 4 { 5 cout << "Person类的友元" << endl; 6 } 7 void fun(); 8 public: 9 Person(string name, int age) :name_(name), age_(age) 10 { 11 12 } 13 private: 14 string name_; 15 int age_; 16 }; 17 void fun(); 18 void func() 19 { 20 fun(); 21 } 22 23 int main() { 24 func(); 25 system("pause"); 26 return 0; 27 }
从上述代码可以看出类内定义的友元函数是公有的,类外可以访问。