【解決方法】コピーコンストラクターがポインターではなく参照によって渡される理由


こんにちは、みんな、

コピーコンストラクターについて質問です。

コピーコンストラクターがポインターではなく参照によって渡されるのはなぜですか?

値渡しができない理由は明らかです。

助けてください。

よろしく、
喜び

解決策 4

解決策 1 と 2 (3 は無視してください) でいくつかの真実が明らかになりましたが、その理由の 1 つは、式など、変換または評価できるものをクラス型に渡すことができるためです。自分で一時変数。

C++
class cVec {
public:
   cVec(const cVec& other);
   cVec(double x, double y);
   cVec operator+(const cVec& first, const cVec& second);
private:
   double x_;
   double y_;
};

void foo() {
   cVec a(3.14, 2.71);
   cVec b(a + a); // now try and pass that by pointer!
}

解決策 1

コピー コンストラクターは、ユーザーが指定しない場合はコンパイラーによって生成されるため、ユーザー定義のコピー コンストラクターには、コンパイラー定義のコピー コンストラクターに使用されるものと同じシグネチャを使用するのが理にかなっています。

誰かが参照の代わりにポインターを取るコンストラクターを定義した場合、呼び出し元が新しいオブジェクトの作成元のオブジェクトのアドレスを取得するのを忘れた場合、ポインターでユーザーコンストラクターを使用する代わりに、コンパイラーが生成したコピー コンストラクター (参照付き) が使用されます。

一貫性のために参照を使用することも理にかなっています。 たとえば、=、==、<=、+= などのすべての演算子は、通常、参照を使用して定義されます。 以下のリンクを参照してください: –
C++ コピー コンストラクターの詳細 [^]

解決策 2

やあ、
まず、参照とは何か、いつ必要になるかを理解しようとします。
参照は、別の変数へのエイリアスとして機能する変数です。参照は暗黙的に const であるため、宣言時に値を指定する必要があります。

まず、const 参照は関数パラメーターとしてよく使用されます。これは、const 参照を使用するとオブジェクトの値にアクセスできますが、値を変更することはできず、関数にオブジェクトへのアクセスを与えるために使用できますが、呼び出し元にオブジェクトが変更されないことを保証するために使用できます。関数によってまったく変わります。

第 2 に、参照は、暗黙的に逆参照される const ポインターのように機能します。
参照は常に有効なオブジェクトを「ポイント」し、割り当て解除されたメモリをポイントすることはできないため、参照はポインターよりも安全に使用できます。 したがって、リファレンスは一般的に優先されるべきです。 通常、ポインタは、参照が十分でない状況でのみ使用する必要があります。そのため、メモリ破損の問題を防ぐために、参照はポインタよりも優先されます。

これらの両方の要因を取ると、次のようなコピー コンストラクターを指定できます。

C#
// Copy constructor
    MyClass(const MyClass &cSource)
    {
        m_nVariable1 = cSource.m_nVariable1;
    }

したがって、渡されるソース オブジェクトはコピー コンストラクター内で変更されることはなく、読み取り専用の目的でのみ使用されます。

解決策 3

// コピー コンストラクターがポインターではなく参照によって渡されるのはなぜですか?

Stroustrup氏による基本的な考え方だと思います
渡されたデータとその簡略化された構文の有効性でした:D


もちろん、独自のコピー コンストラクターを提供することもできます。

B b;
B a(&b);

コメント

タイトルとURLをコピーしました