オブジェクトをパラメーターとして渡すときに、デストラクタが呼び出されているのにコンストラクションが呼び出されていないのはなぜですか?

Razib Hossain Shuvo

私が書く場合、クラスという名前のテストをして書き込みテストタイプのようなショー()関数を

#include <iostream>
using namespace std;

class Test{

public:
    int x;
    Test()
    {
        cout<<"Empty or Default Constructor"<<endl;
    }
    Test(int x)
    {
        cout<<"Valued constructor"<<endl;
    }
    ~Test()
    {
        cout<<"Destructor"<<x<<endl;
    }
    Test show(Test obj)
    {
        Test tt;
        tt.x=20;
        return tt;
    }
};
int main()
{
    Test t1,t2(20);
    t2.show(t2);

    return 0;
}

出力:

Empty or Default Constructor
Valued constructor
Empty or Default Constructor
Destructor : 20
Destructor : 1988276941
Destructor : 1988276941
Destructor : 1972875622

その後の出力を示しデストラクタテストOBJリターンTTが、彼らのために作成されたコンストラクタはありませんが、一般的に、我々はその最初にコンストラクタが作成されます知っているとタスクデストラクタを終えた後に呼び出されますが、渡すと、任意のオブジェクトを戻しながら、なぜそれが例外的なのですか?

ロブ

クラスのインスタンスを値で渡すと、コピーコンストラクターが呼び出されます。

クラス定義でコピーコンストラクターが明示的に提供されていない場合、コンパイラーはデフォルトでコピーコンストラクターを実装します(基本的に、基本クラスのコピーコンストラクターを呼び出した後のメンバーごとのコピー)。このコンパイラで生成されたコピーコンストラクタは、実装した他のコンストラクタの1つを呼び出さないため、コピーを作成しても何も出力されません。ただし、完了すると、コピーをクリーンアップするためにデストラクタが呼び出されます。

クラス内で、次のようにコピーコンストラクターを実装する場合。

Test(const Test &from) : x(from.x)
{
    std::cout << "Copy constructor invoked" << std::endl;
}

コピーコンストラクタが実際に呼び出されていることがわかります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ