前の章では、クラスのコンストラクターを紹介しました。コンストラクターの機能はクラスのメンバーを初期化することであることがわかりますが、コピーコンストラクターは何に使用されますか?コピーコンストラクタは、初期化の関数としても簡単に理解できます。これは、主に次の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()//析构函数同样不能有返回值