コピーコンストラクターがない場合、システムは自動的にコピーコンストラクターを提供し(浅いコピー)、この場合、新しいオブジェクトが作成されると、クラス内のデータが新しいオブジェクトに割り当てられます。ただし、クラスにポインターがある場合、ポインターはそのポインターに割り当てられますが、これにより混乱が生じます。したがって、これはコピーコンストラクターの自己記述につながります。
#include<iostream>
using namespace std;
class student
{
int a;
public:
student()
{
a=100;
}
void getA()
{
cout<<a<<endl;
}
};
int main()
{
student stu1;
student stu2(stu1);//stu2=stu1;//
st2.getA();
system("pause");
return 0;
}
上記のデータは浅いコピーであり、データとデータの間のコピーにすぎません。
コピー構造:クラス名(constクラス名と参照名);
#include<iostream>
using namespace std;
class stu
{
char *p;
public:
student(char *str)
{
p=new char[strlen(str)+1];
strcpy(p.str);
}
void getA()
{
cout<<p<<endl;
}
student(const student&stu)
{
p=new char[strlen(stu.p)+1];
strcpy(p,stu.p);
}
};
void test(student stu)
{
}
student text(student stu)
{
return stu;
}
int main()
{
student stu1("39-lijimin");
//text(stu1).getA();//第三种情况,用完就直接释放了,调用析构函数
//test(stu1);//拷贝构造函数的第二种调用情况
//stu2=stu1;//创造新的类型,用旧的类型赋值的时候,是要求调用拷贝构造的
}
コピーコンストラクターの呼び出し状況:
1.クラスオブジェクトを使用してクラスの別のオブジェクトを初期化する
場合; 2.関数の仮パラメーターがクラスのオブジェクトである場合、関数が呼び出されるときに実際のパラメーターが渡されると、コピー構造が呼び出され
ます3。関数呼び出しが戻ると、関数の戻り値はクラスオブジェクトになります。