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


14

当我们定义复制或移动构造函数时,我们可以访问另一个类的私有变量。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;
}

7
这是同一类。因此,需要新朋友。
M. Spiller

1
参见stackoverflow.com/questions/6921185/…-简而言之,C ++中的访问控制无法区分对象实例,只能区分不同类型的实例
osuka_ '19

当您编写“另一个my_str类”时,这是一个直截了当的错误。这是另一个my_str 实例,其他注释和答案解释了其中的含义
JonathanZ支持MonicaC,

Answers:


21

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

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.
    }
};

其背后的总体思路是允许两个或多个相同类型的对象进行交互,而不必暴露其私有成员。


10

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

因此,它们不friend属于此类,因为这没有任何意义。他们已经是班上的一部分。他们仍然可以访问所有private成员,不是因为他们是friends,而是因为他们是该类的一部分。

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


同样,可访问性与访问成员所在的对象无关。可访问性仅与代码中使用名称(成员名称)的位置有关。如果一个函数可以访问一个类的一个实例的成员,那么它也可以访问同一类的另一个实例的成员。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.