2016-06-29 5 views
-1

コンストラクタを使用してクラスを作成し、オブジェクトの配列を初期化しました。なぜコピーコンストラクタが呼び出されないのですか?それは溶出をコピーしていますか?[Prob]コピーコンストラクタが呼び出されない理由

#include<iostream> 
#include<stdio.h> 

class ABC 
{ 
    int x, y; 
public: 
    ABC() 
    { 
     x = 0; 
     y = 0; 
    } 
    ABC(int a,int b) 
    { 
     x = a; 
     y = b; 
    } 
    ABC(const ABC &obj) 
    { 
     std::cout<<"Copy called"; 
    } 
}; 

int main() 
{ 
    ABC obj[2] = {ABC(), ABC(5,6)}; //copy elision or copy constructor? 
} 
+1

コンパイルコードを入力してください...ヘッダーがありません。コンストラクタはすべて非公開です。 – Holt

+0

はい、これはcopy-elisionによるものです。clangまたはg ++を使用している場合は、 '-fno-elide-constructors'でコンパイルしてみてください。 – Holt

+2

[コピーエリッションと戻り値の最適化とは何ですか?]の複製がありますか?(http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – Holt

答えて

0

そうだね、それはコピーの省略ですが、コンパイラは最適化を行い、右アレイ内で割り当てられたメモリの代わりにオブジェクトを作成し、それゆえコンストラクタは呼び出されませんコピーします。

+0

ありがとうございますコピーelisionしかし、あなたはそれをもっと詳しく説明することができます。私は "-fno-elide-constructors"オプションでprogをコンパイルしてから、コピーコンストラクタを呼び出します。 –

関連する問題