web-dev-qa-db-ja.com

コピーアンドムーブコンストラクターは自動友達ですか?

コピーまたは移動コンストラクターを定義すると、別のクラスのプライベート変数にアクセスできます。 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;
}
14
redkont

フレンドとは見なされませんが、はい、クラスmy_strのメンバー関数は、thisインスタンスだけでなく、タイプmy_strのすべてのインスタンスのプライベートメンバーにアクセスできます。

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つ以上のオブジェクトがプライベートメンバーを公開する必要なく相互作用できるようにすることです。

21
Shloim

クラス自体のメンバー関数は、メンバー関数がクラス内で定義されているかクラス外で定義されているか、コピーなどの特別なメンバー関数であるかどうかに関係なく、常にprivateメンバーにアクセスできます。/moveコンストラクタ。

したがって、これらはクラスのfriendではありません。それは意味がないからです。彼らはすでにクラスの一部です。ただし、privatesであるためではなく、クラスの一部であるため、すべてのfriendメンバーにアクセスできます。

コンストラクターでメンバーを初期化できない場合(メンバーにアクセスできないため)、メンバーのアクセス可能性の概念全体は無意味です。 (メンバーをどのように初期化しますか?)


また、アクセシビリティは、メンバーがアクセスされるオブジェクトの問題ではありません。アクセシビリティは、コードのどこで名前(メンバーの名前)が使用されているかだけの問題です。関数がクラスの1つのインスタンスのメンバーにアクセスできる場合は、同じクラスの別のインスタンスのメンバーにもアクセスできます。

10
walnut