4

違いは何ですか

MyClass mc = MyClass();

MyClass mc;

C ++で?

4

5 に答える 5

8

最初は、一時オブジェクトをパラメーターとして使用してコピー コンストラクターを呼び出します -MyClass()一時を作成します。

2 番目は、既定のコンストラクターを呼び出します。

実際には、ほとんどの場合、それらは同じコードに最適化されていますが、それは意味的な違いです。


Negalが述べたように、ケースは POD タイプでは少し異なります。"MyClass" が POD の場合、2 番目のスニペットは value-initialize を実行しませんがmc、最初のスニペットは実行します。

于 2012-08-14T11:36:55.757 に答える
2

1 つ目はコピーの初期化で、2 つ目はデフォルトの初期化です。

たとえば、次のコードはコンパイルされません。

class MyC
{
public:
MyC(){}
private:
MyC(const MyC&) {}
};

int main()
{
  MyC myc = MyC();
  return 0;
}
于 2012-08-14T11:37:18.347 に答える
1

カスタム コピー コンストラクターと既定のコンストラクター。

于 2012-08-14T11:34:06.307 に答える
0

最初に作成し、次にオブジェクトtemp-objectc-tor without arguments呼び出しcopy-ctorます(最適化は考慮されていません)。2 回目の呼び出しc-tor without arguments、コピーなし。コンパイラの最適化では、両方のケースが等しくなります。

違いは基本型にあるので、

// initialized to something
int c;
// initialized to int() that is 0 by standard.
int c = int();
于 2012-08-14T11:36:43.980 に答える
-3

変わりはない。デフォルトの ctor 呼び出し。シンタックスシュガー)いいえコピーctor!!!!

class PPP{
public:
    PPP(PPP&){
        std::cout<<"PPP1"<<std::endl;
    }
    PPP(const PPP&){
        std::cout<<"PPP2"<<std::endl;
    }
    PPP(){
        std::cout<<"PPP3"<<std::endl;
    }
};
PPP ppp = PPP();

コンソールには PPP しかありません。

于 2012-08-14T11:39:38.120 に答える