【问题标题】:Friendship of class in C++C++中的班级友谊
【发布时间】:2021-06-28 14:31:21
【问题描述】:

考虑以下程序:

#include <iostream>
    using namespace std;
     
    class B;
    class A {
        int a;
    public:
        A():a(0) { }
        void show(A& x, B& y);
    };
     
    class B {
    private:
        int b;
    public:
        B():b(0) { }
        friend void A::show(A& x, B& y);
    };
     
    void A::show(A& x, B& y) {
        x.a = 10;
        cout << "A::a=" << x.a << " B::b=" << y.b;
    }
     
    int main() {
        A a;
        B b;
        a.show(a,b);
        return 0;
    }

在这个问题上让我感到困惑的是,在 A 类内部,我们没有将函数 show 声明为 A 类的友元函数。那么我们如何在show() 函数的定义?

按照我的说法,如果以这种方式定义,show 函数将是 A 类的友元函数:

friend void show(A& x, B& y);

请指导。

【问题讨论】:

  • show() 是类A 的成员,因此它可以访问类A 的所有实例的所有成员。一个类的private 成员可以访问该类的所有成员函数,或者该类的friends。
  • 许多新的 C++ 程序员的困惑是认为private 字段意味着this 实例的成员(就像在现实生活中一样)。 privateprotected 属性适用于每个类,而不是每个实例

标签: c++ oop friend


【解决方案1】:

您可以在同一类的成员函数中访问私有成员。 A::showA 的成员,可以访问A 的所有成员。


如果不是这样,私人成员将是一个很大的烦恼。考虑这个例子:

class C {
     int x;
     void foo() {
         x = 42;
     }
};

C 拥有所有成员私有,foo 可以访问x 而无需与他们成为朋友。 friend 仅适用于在您认为合适的情况下希望以受控方式破坏封装的特殊情况。


此外,我建议您查看书中解释成员函数的部分。您的show 不使用this(当前对象),因此它可能是一个免费功能(在这种情况下,您实际上需要将其设为朋友才能访问私有成员)。虽然我认为它应该是:

 void A::show(const B& y) {
    a = 10;
    cout << "A::a=" << a << " B::b=" << y.b;
 }

您也不应该在名为show 的方法中分配给成员,然后将该方法声明为const。但一次只做一件事,我不想完全改变你的代码。

【讨论】:

  • 令我惊讶的是,任何教科书或课程在解释之前都会涵盖friend
  • 哦,也就是说,show函数其实是A类的成员函数吧?
  • @Useless 一些想法在这里,但有时我决定写一个答案而不是一个尖刻的评论;)
  • @loveofprogramming 似乎您跳过了有关成员访问的部分并跳到了解释friend 的部分。那是不幸的。请注意,应在特殊情况下仅在需要时才将函数或类与另一个函数或类交朋友。
  • 是的,在你的类体内声明的所有函数都是成员函数(就像数据成员一样)......除了friend声明的exception,它是为什么他们会得到一个特殊的关键字。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多