タイトルコピーコンストラクターと代入コンストラクターの違い
c ++のコピーコンストラクター
たとえば、テスト目的で次のコードを見てください。クラスのすべての関数はcppファイルに記述されています。
#include
#include <Windows.h>
名前空間stdを使用します。
クラステスト{
公衆:
Test(){
}
Test(const Test &other){
cout << "调用拷贝构造" << endl;
}
Test &operator=(const Test &other){
cout << "调用赋值构造" << endl;
return *this;
}
};
int main(void){
Test v1;
Test v2(v1);//调用拷贝构造函数
v2 = v1;//调用赋值构造函数
system("pause");
return 0;
}
外観に関する要約:いわゆる代入コンストラクターは、2つの既存のオブジェクトに対して代入操作を実行することです。
次に例を示します。Testv1、v2;
v1 = v2 //これは代入コンストラクターです
Testv3(v1); //存在しないオブジェクトを作成するときは、上記のようにコピーコンストラクターを呼び出します。
注:内部に定義済みのポインターがある場合は、メモリー解放の問題があります。例として、
プライベートメンバー
char * name;の定義を取り上げます。
コピーコンストラクタでメモリを解放する必要はありませんが、代入コンストラクタでメモリを解放する必要があります。
(ベクトルはベクトルではなく、前者は大文字のVです!Tはテンプレートクラスです)
Vector&Vector :: operator =(const Vector&object){
if (m_base){
delete[] m_base;
}
this->m_len = object.m_len;
this->m_base = new T[m_len];
for (int i = 0; i < m_len; i++){
m_base[i] = object.m_base[i];//why?
}
return *this;
}
単純な理解必要がメモリを解放するときに、割り当てコンストラクタは、2つの既存のオブジェクトの割り当て動作です。コピーコンストラクターは、既存のオブジェクトを次のオブジェクトにコピーすることです。もちろん、この次のオブジェクトをリリースする必要はありません。彼はメモリを割り当てていないので、メモリを解放する必要がありますか?答えは絶対に必要ありません。
//ここでは記憶判断の解放はありません!
Vector :: Vector(const Vector&object){
cout << "调用拷贝构造函数" << endl;
m_len = object.m_len;
m_base = new T[m_len];
for (int i = 0; i < m_len; i++){
m_base[i] = object.m_base[i];
}
}