101

クラス内の get 関数を使用する場合にのみ、プライベート変数にアクセスできないことを学びました。しかし、なぜコピーコンストラクターでアクセスできるのでしょうか?

例:

Field::Field(const Field& f)
{
  pFirst = new T[f.capacity()];

  pLast = pFirst + (f.pLast - f.pFirst);
  pEnd  = pFirst + (f.pEnd - f.pFirst);
  std::copy(f.pFirst, f.pLast, pFirst);
}

私の宣言:

private:
  T *pFirst,*pLast,*pEnd;
4

6 に答える 6

121

アクセス修飾子は、オブジェクト レベルではなく、クラス レベルで機能します。

つまり、同じクラスの 2 つのオブジェクトは、互いのプライベート データにアクセスできます。

どうして:

主に効率のためです。アクセス修飾子がオブジェクトレベルで機能する場合にアクセスするthis == otherたびに確認する必要があるかどうかを確認するのは、無視できないランタイムオーバーヘッドです。other.x

また、スコープの観点から考えると、意味論的にも論理的です。「プライベート変数を変更するときに、コードのどの部分を覚えておく必要があるか?」– クラス全体のコードを念頭に置く必要があります。これは、実行時に存在するオブジェクトと直交しています。

また、コピー コンストラクターや代入演算子を作成するときにも非常に便利です。

于 2010-11-07T08:34:15.340 に答える
35

クラス内からクラスのプライベート メンバーにアクセスできます。別のインスタンスのプライベート メンバーにもアクセスできます。

于 2010-11-07T08:34:56.900 に答える
11

答えを理解するために、いくつかの概念を思い出させていただきたいと思います。

  1. 作成するオブジェクトの数に関係なく、そのクラスのメモリには1つの関数のコピーが1つだけあります。これは、関数が1回だけ作成されることを意味します。ただし、変数はクラスのインスタンスごとに異なります。
  2. thisポインタは、呼び出されるとすべての関数に渡されます。

これはポインタのおかげでthis、関数はその特定のインスタンスの変数を見つけることができます。それが公の私的であるかどうかに関係なく。その関数内でアクセスできます。ここで、同じクラスの別のオブジェクトへのポインタを渡すと、この2番目のポインターを使用して、プライベートメンバーにアクセスできるようになります。

これがあなたの質問に答えることを願っています。

于 2012-05-23T13:14:12.997 に答える
6

コピー コンストラクターはクラスのメンバー関数であるため、「プライベート」として宣言されているものであっても、クラスのデータ メンバーにアクセスできます。

于 2010-11-07T09:44:49.470 に答える
0

そのコンパイラを作成した人がこの動作を許可した理由は、コピー コンストラクターまたはクラス内の任意のメソッドで、オブジェクトの非表示のメンバー(その型が非表示のメンバーにアクセスするクラスと同じであること)を確認できることです。

答え:あなたがクラスにいるとき、それはあなたがクラスのビルダーまたはデザイナーであることを意味するため、そのクラスのすべてのデータメンバーとメソッドを知っていることを意味します。クラスのユーザーとは異なり、あなたのようにクラスについてすべてを知っているわけではありません。

このクラスのユーザーを助け、重要でないものと混同しないようにするデータメンバーまたはメソッドを非表示にするという考え。

それでおしまい。

于 2021-11-28T01:14:09.133 に答える