5

C++ を使用するシグナル クラスにこのプロジェクトがあります。これを見たとき、私はインストラクターのコードをいじっていました:

ListData::ListData(const ListData& newlist) 
    : Data(), nbNodes(newlist.nbNodes) {}

彼が言うように、これは「コピーコンストラクター」であり、次のものとほぼ同等である必要があります。

ListData::ListData(const ListData& newlist){
  Data = "";
  //copy nbNodes of newList to current instance
  nbNodes = newlist.nbNodes;
}

しかし、私が気になるのは、それnbNodesが非公開メンバーであることです。プライベートの場合、このコンストラクターはどのようnbNodesに渡されたのにアクセスできますか?newList

4

6 に答える 6

10

プライベート メンバーの興味深い点は、同じ型の 2 つのオブジェクトが互いのプライベート メンバーに自由にアクセスできることです。クラスは常にそれ自体と友達であると考えることができます。これは のコンストラクタでListDataあり、newlistであるためListData、プライベートに問題なくアクセスできます。

この例を次に示します

#include <iostream>

class foo
{
  public:
    foo() { }
    foo(std::string secret) : secret(secret) { }
    void steal_secret(const foo& other) { secret = other.secret; }
    std::string get_secret() { return secret; }
  private:
    std::string secret;
};

int main() {
    foo f1("I'm actually a bar");
    foo f2;
    f2.steal_secret(f1);
    std::cout << f2.get_secret() << std::endl;
    return 0;
}

f2プライベートであるにもかかわらず、喜んで簡単にsecretfromを盗みます。f1

これが許可されている理由はprivate、オブジェクトに対してプライベートを意味するのではなく、クラスに対してプライベートを意味するからです。これにより、同じクラスの 2 つのオブジェクトの内部に何らかの作業を行う必要があるコピー コンストラクターなどの関数の実装が容易になります。

ルールはprivate(§11/1)の定義から来ています。

クラスのメンバーは、

  • private; つまり、その名前は、それが宣言されているクラスのメンバーとフレンドだけが使用できます。
  • [...]

オブジェクトではなく、クラスに関して定義されていることに注意してください。

于 2013-02-27T14:28:33.297 に答える
6

キーワードには、privateオブジェクト セマンティクスではなく、クラス セマンティクスがあります。したがって、クラスのオブジェクトのプライベート メンバーは、同じクラスの他のオブジェクトにアクセスできます。

于 2013-02-27T14:27:56.987 に答える
4

nbNodesそのクラスの特定のインスタンスに対してではなく、そのListData クラスに対してプライベートです。したがって、クラスのコード内で、そのクラスの他のインスタンスのプライベート データを確認できます。

そうでない場合、すべてのクラスは、コピーの構築とコピーの割り当てを実行するために、すべてのデータ メンバーの「ゲッター」をエクスポートする必要があります。

于 2013-02-27T14:28:06.050 に答える
2

C++ 標準、第 11 章: メンバー アクセス制御から:

プライベート; つまり、その名前は、それが宣言されているクラスのメンバーとフレンドだけが使用できます。

つまり、プライベート メンバーには、そのクラスの任意のメンバーがアクセスできます。

これはListDataListData::ListData(const ListData& newlist)のコピー コンストラクターです。これはメンバー関数であるため、クラス ListData のプライベート メンバーにアクセスできます。

于 2013-02-27T14:37:58.530 に答える
2

コピー コンストラクターは、他のメソッドとまったく同じです。そのクラスのメソッドからクラスのプライベート メンバーにアクセスできるため、コピー コンストラクターを使用して同じことができます (そうでなければ、インスタンスの状態をクラスにコピーする方法はありません)。別のものに?)。

于 2013-02-27T14:29:23.710 に答える
2

可視性を持つメンバーは、メンバーである同じクラスのメンバー関数内でprivateのみアクセスできるメンバーであり、オブジェクトの制限はありません。

functionf()が class のメンバー関数である場合、暗黙のポインターが指すメンバーだけでなく、の任意のインスタンスのメンバーにCアクセスできます (もちろん、ポインターをまったく受け取らない関数に対してもこれが有効になります)。 .privateCthisstaticthis

于 2013-02-27T14:28:08.227 に答える