复制和移动构造函数是自动朋友吗?

are copy and move constructors automatic friends?

提问人:redkont 提问时间:11/25/2019 最后编辑:walnutredkont 更新时间:11/25/2019 访问量:1318

问:

当我们定义复制或移动构造函数时,我们可以访问另一个类的私有变量。C++ 会自动使它们相互连接吗?friend

例如:

my_str::my_str(my_str&& m) 
{
    size_ = m.size_; //accessing private variable another my_str class
    buff_ = m.buff_; //accessing private variable another my_str class
    m.buff_ = nullptr;
    m.size_ = 0;
}
C++ 友类

评论

7赞 MSpiller 11/25/2019
这是同一类。所以需要朋友。
1赞 osuka_ 11/26/2019
参见 stackoverflow.com/questions/6921185/... - 简而言之,C++ 中的访问控制不区分对象实例,只区分不同类型的实例
0赞 JonathanZ 11/26/2019
当你写“另一个my_str类”时,这是一个直接的错误。这是另一个my_str实例,其他评论和答案解释了这意味着什么

答:

10赞 walnut 11/25/2019 #1

类本身的成员函数始终可以访问成员,无论成员函数是在类内定义还是在类外定义,也无论它是特殊成员函数(如复制/移动构造函数)定义。private

因此,他们不属于该类,因为这没有任何意义。他们已经是班级的一部分。尽管如此,他们仍然可以访问所有成员,不是因为他们是 s,而是因为他们是班级的一部分。friendprivatefriend

如果无法在构造函数中初始化成员(因为它们不可访问),那么成员可访问性的整个概念将毫无意义。(您将如何初始化成员?


此外,可访问性绝不是访问成员的对象的问题。可访问性只是代码中名称(成员名称)的使用位置的问题。如果函数可以访问类的一个实例的成员,则它也可以访问同一类的另一个实例的成员。

21赞 Shloim 11/25/2019 #2

它不被视为朋友,但是是的,类的任何成员函数都可以访问所有类型的实例的私有成员,而不仅仅是实例:my_strmy_strthis

class my_str {
    void foo(my_str& other) {
        // can access private members of both this-> and other.
    }

    static void bar(my_str& other) {
        // can access private members of other.
    }
};

它背后的一般思想是允许 2 个或更多相同类型的对象进行交互,而不必公开其私有成员。