一个类是否自动成为它本身的友元?

8
为什么这个有效?
#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()。类自动成为自己的友元吗?
谢谢

类总是彼此的朋友。 - Shravan40
也许更好的想法是,C++的封装是基于类级别而不是对象级别的。 - Nir Friedman
1
@NirFriedman:除了这个并不严格正确——你不能访问另一个对象的“protected”成员,即使是从继承相同成员的对象中访问。 - MSalters
3个回答

11

是的,一个类的public方法可以访问它自己的private成员变量是有意为之的,即使该方法正在操作不同的实例。

我想可以这么说,一个类自动成为了自己的“朋友”。


6
基本上,是的,该类是自己的朋友,但更好的解释是:在C++中,访问控制是以每个类为基础而不是每个对象为基础工作的。(摘自这里)
请注意,这也适用于其他语言,例如Java(其中没有“友元”),其中访问控制也是基于每个类的基础。

2

所有的类方法,无论是静态的还是非静态的,都自动成为类的“朋友”。 “朋友”用于允许外部函数和类访问一个类。该类始终是自己的“朋友”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接