コピーと移動のコンストラクターは自動友達ですか?


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.スピラー

1
stackoverflow.com/questions/6921185/…を参照してください。つまり、C ++のアクセス制御では、オブジェクトインスタンス間ではなく、異なるタイプ間でのみ識別されます。
osuka_

「別のmy_strクラス」と書いた場合、それは正直な間違いです。これは別のmy_str インスタンスであり、他のコメントと回答はそれが何を伴うかを説明しています
JonathanZはMonicaCをサポートします

回答:


21

フレンドとは見なされませんが、クラスのメンバー関数は、インスタンスだけでなくmy_str、タイプのすべてのインスタンスのプライベートメンバーにアクセスできます。my_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つ以上のオブジェクトがプライベートメンバーを公開する必要なく相互作用できるようにすることです。


10

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

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

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


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.