とは
- 変換コンストラクタを定義する目的は、自動型変換を実現することです
- パラメーターは1つだけであり、パラメーターの型がクラス(コピーコンストラクターではない)、つまり変換コンストラクターと異なる
- 必要に応じて、コンパイルシステムは自動的に呼び出し、名前のない一時オブジェクトを作成します。
#include<iostream>
using namespace std;
class temp
{
private:
int real;
int imag;
public:
temp():real(0),imag(0){
}
temp(int i):real(i),imag(0){
}
int r(){
return real;
}
int i(){
return imag;
}
};
int main()
{
temp t1,t2(6);
t1=9; //9被自动转换为临时的temp对象
cout<<t1.r()<<" "<<t1.i()<<endl;
cout<<t2.r()<<" "<<t2.i()<<endl;
}
結果
デストラクタ
- オブジェクト配列の存続期間が終了すると、オブジェクト配列の各要素のデストラクタが呼び出されます
- デストラクタを呼び出す順序もLIFOに従います
- パラメータオブジェクトが終了すると、デストラクタが呼び出されます
- 戻り値はvalueで、一時オブジェクトのコピーも破棄されます。デストラクタを呼び出します
コンストラクタとデストラクタの呼び出しシーケンス
class temp{
int x;
public:
temp(int i=0):x(i){
cout<<"id = "<<x<<" Constructor
called\n";}
temp(const temp& j):x(j.x){
cout<<"id = "<<x
<<" Copy constructor called\n";}
~temp(){
cout<<"id = "<<x<<" Destructor called\n";}
temp func(const temp& t);
};
temp temp::func(const temp& t)
{
x=t.x;
static temp t4(5);
cout<<"I am here\n";
return t;
}
temp t0(1);
int main()
{
temp t1,t2(2);
t1=3;
{
temp t3(4);}
t1.func(t2);
}
分析:t0が最初に呼び出され、
t1が呼び出され、t2が呼び出され、
t1変換コンストラクターが呼び出され、一時オブジェクトが生成され、次にデストラクタが
t3が呼び出され、ライフサイクルがブロック内にあり、デストラクタが
funcメンバー関数を呼び出します呼び出されると、静的オブジェクトt4が呼び出され、
戻り値はvalue、一時オブジェクトコピーが生成されてから破棄され、次に
t1、t2(先入れ先出し、最後出し)、次にt4、次にt0 が呼び出されます。
(補足:コンストラクタとデストラクタの理解)
コンストラクターは記憶域を割り当てず、クラスは既にメモリ内にあり、コンストラクターが初期化を担当します。デストラクタは、ストレージスペースの回収を担当しませんが、