[C++]【类】友元的三种声明及注意事项

版权声明:未经博主同意不得转载 https://blog.csdn.net/ycwwl1993/article/details/89494733

  类允许其他类或者函数访问它的非公有成员,但我们需要将访问类非公有成员的其他类或者函数成为它的友元。
一、友元函数
  如果类想要把一个函数作为他的友元,只需要增加一条以 friend 关键字开始的函数声明语句即可。
例如:

class A{
    friend void fri_fun(A);
private:
    int a=9;
};
void fri_fun(A aa){
    cout<<aa.a<<endl;
}

  在代码中,我们在类 A 中声明了函数 fri_fun ,并以 friend 关键字加以说明,此时我们可以在函数 fri_fun 中访问 A 类的私有成员。
  友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能过调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行声明。
  一些编译器允许在尚无友元函数的初始声明的情况下就调用它。即使这样,也最好还是提供一个独立的函数声明。
二、友元类
  友元类也需要 friend 关键字加以说明。
例如:

class B{
    friend class A;
    int s=9;
};
class A {
public:
    void aa(B c) {
    cout << c.s << endl;
    }
};

  类 A 的成员函数可以访问类 B 的私有成员。
注意:如果我们把类 A 放在类 B 的前边,此时编译会出错,因为在编译类 A 时,我们并没有定义类 B。
  我们也可以将成员函数作为另一个类的友元,我们将上一个代码更改,仅仅让类 A 的成员函数 aa 可以访问类 B 的私有成员:

class B;
class A{
public:
    void aa(B c);
};
class B{
    friend void A::aa(B);
    int s=9;
};
void A::aa(B c){
     std::cout << c.ss << std::endl;
}

  我们将类 A 的成员函数 aa 作为类 B 的友元函数,这是我们必须在类 B 之前声明函数 aa (我们的代码,在类 A 中已经声明),在类 B 之后定义(如果用到类 B 的成员),在友元声明中我们必须指明该函数属于哪一个类。
  在类 A 中,成员函数 aa 的形参包含 B 类类型元素,所以在类 A 之前,必须有类 B 的前向声明。

参考书籍:《C++ Primer(第五版)》

猜你喜欢

转载自blog.csdn.net/ycwwl1993/article/details/89494733
今日推荐