1

クラスのオブジェクトを参照渡しするのはなぜですか。アンパサンド (&) を削除すると、次のエラーが発生します。

"Copy constructor of class A may not have parameter of type A"

これは何を意味するのでしょうか?コンパイラは、与えられたコピー コンストラクターとデフォルト コンストラクターの使用を考慮していない可能性があります。簡単に言えば、なぜアンパサンドを使用し、何が起こるのでしょうか? そうしないと。

class A
{
public:
    A()
    {

    }



    A(A& tmp)
    {
        id = 2*tmp.id;
    }

public:
    int id;
};


int main()
{
    A obj;
    obj.id = 10;

    A obj1(obj);  
    cout << obj1.id;
}
4

4 に答える 4

5

C++ では、関数は値または参照によってパラメーターを受け取ることができます。パラメータを値で取得する場合、その値はコピー可能でなければなりません。コピー コンストラクターがパラメーターを値で受け取ることができる場合、コピー コンストラクターにそのパラメーターを渡す必要があり、無限ループが発生します。

検討:

class MyInt
{
    int m;

public:

    MyInt(int i)
    {
        m = i;
    }

    MyInt(MyInt j)
    {
          j.m++;
          m = j.m;
    }
};

MyInt a(1);
MyInt b(a);

コンパイラはどのようにこれを機能させることができますか? デフォルトのコピー コンストラクターを使用している場合、なぜコンストラクターを呼び出す必要があるのでしょうか。そして、コンストラクターを使用する場合、コンストラクターに独自のコピーを与えるコードがない場合、どのようa.mにインクリメントされないようにしますか (これは明らかに間違っています。値で渡されたときに変更しないでください)。a

于 2014-03-12T10:45:07.483 に答える
5

そうしないとどうなるか想像してみてください:

1) パラメーターは値によってコピー コンストラクターに渡されるようになりました

2)値で渡すために、コピーコンストラクターを呼び出します

3) 後藤1

于 2014-03-12T10:42:43.810 に答える
2

C++ で関数/メソッドに変数を渡す方法は 3 つあります。値渡し、アドレス渡し、参照渡し (プリティ ラッパーでは実際にはアドレス渡しです)。アドレス渡しと参照渡しは、基礎となる関数/メソッドに渡されるものが実際には、渡すオブジェクトがある場所のメモリアドレスであるという点で最も単純です。ただし、値渡しするには、ソース オブジェクトのコピーを作成する必要があります。それがコピー コンストラクターの仕事です。

コピー コンストラクターが A のインスタンスを受け入れるには、A のコピーを作成できる必要があります。これには、再帰的な要件であるコピー コンストラクターが必要です。

于 2014-03-12T10:42:57.290 に答える