• 全局函数的友元声明的作用是影响访问权限,也就是该全局函数可以访问类内私有的成员属性,但是友元的声明起不到普通声明的作用,也就是定义出现在使用后面必须得另外声明,光靠友元声明是不行的。
 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 }

从上述代码可以看出类内定义的友元函数是公有的,类外可以访问。

posted on 2023-06-11 11:02  小凉拖  阅读(26)  评论(0编辑  收藏  举报