1

Q1:「自己クラスの型付きポインター コンストラクター」にはまともな/正式な名前はありますか?

Q2:コピー コンストラクターが「自己クラスの型付きポインター コンストラクター」よりも有名なのはなぜですか?

または、「自己クラスの型付きポインターコンストラクター」ではなく、コピーコンストラクターを使用する必要があるのはどのような場合ですか?

class MyClass 
{
public:  
    int i;
    MyClass()
    {
        i = 20;
    }

    //Copy constructor
    MyClass(MyClass const & arg) 
    {
        i = arg.i;
    }

    //What kind of Constructor is this one? 
    MyClass(MyClass* pArg)
    {
        i = pArg->i;
    }
};

int main() {
    MyClass obj;
    MyClass* p = new MyClass();

    //call copy constructor
    MyClass newObj(obj);                //call copy constructor directly
    MyClass newObj2(*p);                //dereference pointer and then call copy constructor
    MyClass* pNew = new MyClass(*p);    //dereference pointer and then call copy constructor

    //Call THE constructor
    MyClass theObj(&obj);               //get the address, call THE constructor
    MyClass theObj2(p);                 //call pointer constructor directly
    MyClass* ptheNew = new MyClass(p);  //call pointer constructor directly
}
4

2 に答える 2

4

特別なことは何もないので、特別な名前はありません。

コピー コンストラクターは特別なので、「より有名」です。言語が機能する方法の基本的な部分であるため、特別です。コピー コンストラクターを宣言しない場合、ほとんどのクラスで暗黙的に定義されます。次のような多くの基本的な操作に関与しています。

void foo(MyClass obj) // the copy ctor is (potentially) called to create this parameter
{
    ...
}

MyClass bar() // the copy ctor is (potentially) called when this function returns, and when it result is used
{
    ...
}

MyClass a;
MyClass b(a); // This calls the copy constructor
MyClass c = b; // So does this

多くの場合、コピーは最適化されていないことに注意してください。エリシオンのコピーを参照してください。また、C++11 では、以前はコピー コンストラクターが呼び出されていた多くの場所で、移動コンストラクターが呼び出されます。しかし、移動コンストラクターも、コピー省略が発生する可能性がある同じ場所で最適化することができます。

あなたが「THEコンストラクター」と呼んでいるように、これを使用する理由はあまり思いつきません。

ちなみに、コピー コンストラクターには、ほとんどの場合、次のシグネチャが必要です。

MyClass(MyClass const &)

これじゃない:

MyClass(MyClass &)
于 2013-09-12T02:53:55.403 に答える
0

C++ のオブジェクトには、通常、ポインターではなく参照を使用します。参照を使用してオブジェクトのアドレスを取得できますが、「.」を使用できます。そのメソッドまたはデータにアクセスするには、'->' よりも単純で直接的です。「THEコンストラクター」を使用する必要はないと思います。

于 2013-09-12T03:04:57.690 に答える