タイトルコピーコンストラクターと代入コンストラクターコンパイラーの使用法の違い

タイトルコピーコンストラクターと代入コンストラクターの違い

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];
}

}

おすすめ

転載: blog.csdn.net/weixin_45825875/article/details/106039077