C ++スタディノート10クラスのコピーコンストラクタとデストラクタ

前の章では、クラスのコンストラクターを紹介しました。コンストラクターの機能はクラスのメンバーを初期化することであることがわかりますが、コピーコンストラクターは何に使用されますか?コピーコンストラクタは、初期化の関数としても簡単に理解できます。これは、主に次の3つの状況で使用され
ます。1。すでに初期化されているクラスで、このクラスを使用して別のクラスを初期化する場合は、単に新しいものとして理解します。クラスの割り当て。
2.関数が呼び出されたときに、関数の仮パラメーターが型のオブジェクトである場合、実際のパラメーターが相互に変換されるときにコピーコンストラクターが呼び出されます。
3.クラスのオブジェクトが戻り値として使用される場合、コピーコンストラクターは戻り時に呼び出されます。
コピーコンストラクタの基本形

类名 (const  类名 &p);//复制构造函数的形式,这里其实去掉const 依然可以,但是为了数据安全不修改实参的值,通常改为如此,可以简单的理解为只读的模式

以下は、コピーコンストラクターを呼び出す3つのケースを説明する簡単な例です。

# include<iostream>
# include <string>
using namespace std;
//定义point类,私有成员数据为 x y
class point {
    
    
public:
 
	point(int xx=0, int yy=0) :x(xx), y(yy){
    
    }//构造函数。初始化列表构造方式
	point(const point &p);//复制构造函数
	int getx() {
    
     return x; }//获取成员x的值
	int gety() {
    
     return y; }//获取成员y的值


private:
	int x, y;

};
//构造函数的定义方式,数值一一复制,也叫浅拷贝
point::point(const point &p)
{
    
    
	x = p.x;
	y = p.y;
	cout << "calling copy constructor" << endl;
}
//将函数的形参定义为类的对象。输出其中的值
void fun1(point p1)
{
    
    
	cout << "the x value is" << p1.getx() << endl;
}
//类的对象作为返回值类型,简单进行反转
point fun2(point p1,point p2)
{
    
    
	point p3;
	p3 = p1;
	p1 = p2;
	p2 = p3;
	return p1;
}
int main()
{
    
    
void fun1();
point fun2(point p1,point p2);
point a;
point b(a);//使用当前已有对象去初始化另一个对象,会使用构造函数
cout << "b.x " << b.getx() << endl;
cout << "b.y " << b.gety() << endl;
point c(1, 2);//初始化c
fun1(c);//输出第一个的值
point c1 = fun2(c, a);//反转
cout << "the swap c1 x is" << c1.getx() << endl;

return 0;



}

プログラムの成果は以下のとおりです。
ここに画像の説明を挿入

上記のコピーコンストラクターを読んだ後、疑問があるかもしれません。この1対1の対応する値のコピーは、特別な関数を作成する価値がないようです。コピーコンストラクターは役に立たないようですが、実際、これは理解と使用を容易にするためだけのものです。コピーが浅いため、コピーコンストラクターは少し面倒だと思います。ディープコピーを使用する場合は、引き続きコピーコンストラクターを詳しく紹介します。

では、デストラクタとは何ですか?関数を例にとってみましょう。データが関数で定義されている場合、そのライフサイクルは関数本体にのみ存在します。関数が実行されると、データメモリも消滅します。次に、クラスのオブジェクトの場合、初期化後メモリを解放するには?簡単に言えば、デストラクタを使用してメモリを解放することです。デストラクタを定義しない場合、システムはデフォルトのデストラクタを生成します。上記のクラスを例にとると、デストラクタの形式は次のとおりです。

~point()//析构函数同样不能有返回值

おすすめ

転載: blog.csdn.net/qq_41803340/article/details/112548463