【问题标题】:Is a class automatically a friend of itself一个类是否自动成为它自己的朋友
【发布时间】:2017-01-17 03:56:04
【问题描述】:

为什么会这样?

#include <stdio.h>

class ClassA
{
public:
    ClassA(int id) : my_id(id) { };

    ClassA * makeNewA(int id)
    {
        ClassA *a = new ClassA(id);
        printf("ClassA made with id %d\n", a->getId());
        return a;
    };

private:
    int getId() {
        return my_id;
    };

private:
    int my_id;
};

int main()
{
    ClassA a(1);
    ClassA *b = a.makeNewA(2);
    return 0;
}

不管它是否是一个好主意,为什么它会起作用?公共函数ClassA::makeNewA(int) 实例化一个新的ClassA,然后使用新对象调用私有函数getId()。一个类会自动成为它自己的朋友吗?

谢谢

【问题讨论】:

  • 班级永远是自己的朋友。
  • 也许更好的思考方式是 C++ 封装是类级别,而不是对象级别。
  • @NirFriedman:除非严格来说这不是真的 - 你不能访问另一个对象的 protected 成员,即使是从继承了相同成员的对象。

标签: c++


【解决方案1】:

是的,一个类的public 方法可以访问它自己的private 成员是有意的,即使该方法作用于不同的实例。

我想可以说一个类自动成为它自己的“朋友”。

【讨论】:

    【解决方案2】:

    所有类方法,不管是静态的还是非静态的,都自动成为 班级。 Friend 用于允许外部函数和类访问 上课。该类始终是它自己的“朋友”。

    【讨论】:

      【解决方案3】:

      基本上,是的,这个类是它自己的朋友,但更好的解释是:

      在 C++ 中,访问控制是基于每个类而不是基于每个对象的。

      (复制自there

      请注意,这也适用于其他语言,例如Java(您没有朋友),其中访问控制也适用于每个班级基础。

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 1970-01-01
        • 2023-03-24
        • 2011-06-28
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        相关资源
        最近更新 更多