1

プライベートクラスのメンバーへのパブリック参照は許可されていますか?次のコードはコンパイルされ、私が使用していたので、99%のケースで機能しました。問題は、PODを使用している場合でも、プライベート変数へのconst参照が間違ったデータを返すという構成に実際に遭遇することです。それで、それにいくつかの一般的な問題があります-間違った構文、またはそれが失敗する可能性がある他の場合ですか?Get()メソッドを使用するのに対してconst参照を使用すると、パフォーマンス上の利点はありますか?次のコードのコメントを参照してください...これは「優れたコーディングスタイル」の観点からどのように見られますか?「良い実践」はどうですか?

独自の調査:単純なデータ型を使用する場合、Get()メソッドではなくconst参照を優先するパフォーマンス上の利点はおそらくありません。大きな構造体を使用する場合は、参照だけを返すと便利な場合があります。Const refは、適切なOOPルール(カプセル化とライフタイム)に違反する可能性があります。

しかし、繰り返しになりますが、基本的な質問です。有効な(既存の)インスタンスで使用している場合でも、「const int&Width」が失敗する理由はありますか?dllからクラスCTestをエクスポートするのはどうですか?どうも

class CTest
{
public:
  // public reference to a private variable - is this allowed? What about standards, what about 'good coding'?
  const int & Width; // read only property

  // Is there some performance penalty for GetWidth1() compared to previous reference Width?
  /*(inline)*/ int GetWidth1() const { return _width; } 

  // some performance benefit or disadvantage writting GetWidth2 rather than GetWidth1()?
  const int & GetWidth2() const { return _width; } 

  CTest(int width):
    Width(_width), // initialize public reference to a private variable - is this correct?
    _width(width)  // initialize member variable
  {}
private:
  int _width;
};

int main()
{
  CTest cTest(10);
  CTest * pTest = new CTest(10);

  int width1 = cTest.Width; // is this possible? Is there some reason (not) to use such a construction?
  int width2 = pTest->Width;
  int width3 = pTest->GetWidth1(); // of course, correct. But is there some performance penalty compared to pTest->Width?

  return 0;
}
4

2 に答える 2

2

プライベート クラス メンバーへのパブリック参照は許可されますか?

はい、本質的に何も問題はありません。「間違ったデータを返す」というケースを見たことがある場合、それは何か他の問題が発生したことを意味します - おそらくメモリの破損、データメンバーが初期化される前の参照へのアクセス、またはターゲットが破棄された後のダングリング参照の使用.

最大の問題は、参照が割り当て可能ではないことです。したがって、参照を含むクラスも同様です。

Get() メソッドの使用に対して const 参照を使用すると、パフォーマンス上の利点はありますか?

参照ではなくインライン関数を使用することでメリットが期待できます。クラス インスタンスに格納するものは何もなく、実行時の間接参照も必要ありません。データ メンバーに直接アクセスするのと同じくらい効率的です。そのため、参照メンバーを使用しないことをお勧めします。

これは「優れたコーディング スタイル」という観点からどのように見られますか? 「良い実践」はどうですか?

一般に、データ メンバーへのアクセスは、クラスが十分にカプセル化されていないことを示している可能性があります。通常、適切な (オブジェクト指向の) プラクティスでは、どのデータを処理するかではなく、何を行うかという観点からインターフェイスを指定します。しかし、それは非常に一般的なアドバイスです。最適な設計では、データへのアクセスが必要になる場合があります。ただし、効率を高めるために、パブリック データ メンバーまたはインライン アクセサー関数のいずれかを使用してそれを許可する必要があります。

于 2012-12-03T13:49:13.970 に答える
1

プライベート データへの参照を公開することは確かに許可されています。また、正しく使用すると正常に動作します。ただし、ほとんどの場合、コンパイラは参照を表すポインタまたは参照を実際に格納するため、変数へのアクセスを提供するインライン関数よりもおそらく処理が遅くなることに注意してください。インダイレクションの保存を使用するコストは、オブジェクト サイズの増加と追加の逆参照です。失敗したと言うときは、コピー コンストラクターを使用したときなどに、参照を正しく初期化していないのではないかと思います。

ところで、main()常に戻りますint(ただし、return ステートメントは省略できます)。

于 2012-12-03T13:43:10.383 に答える