拷贝
class vector
{
int sz; //大小
double* elem; //指向元素的指针
pulic:
vector(int s) //构造函数
:sz{s},elem{new double[s]} {/*...*/} //分配内存
~vector() //析构函数
{delete[] elem;} //释放内存
}
void f(int n)
{
vector v(3); //定义一个包含3个元素的vector
v.set(2,2.2); //将v[2]设置为2.2
vector v2 = v; //会发生什么?
}
对于指针成员而言,仅仅对指针成员进行拷贝会产生问题。
v.set(1,99); //set v[1]to 99
v2.set(0.88); //set v2[0] to 88
cout<<v.get(0)<<''<<v2.get(1);
输出结果将会是88 99
我们想要的是00 00
由于v与v2的elem指向同一块内存,因此两次释放这块内存很可能造成灾难
性的后果。
拷贝构造函数
vector(const vector&);
我们试图使用一个vector初始化另一个vector时,这一拷贝构造函数将会被调用。
拷贝构造函数使用对象引用作为参数的原因在于我们(显然)不希望在传递函数参数时又发生参数拷贝
,而使用const引用的原因在于我们不希望函数对参数进行修改。
class vector
{
int sz; //大小
double* elem; //指向元素的指针
pulic:
vector(const vector&) //拷贝构造函数:定义拷贝操作
}
vector:: vector(const vector& arg)
//分配元素,然后通过拷贝初始化它们
:sz{arg.sz},elem{new double[arg.sz]}
{
copy(arg.elem, arg.elem.sz, elem);
}
vector v2=v;
v.set(1,99); //set v[1]to 99
v2.set(0.88); //set v2[0] to 88
cout<<v.get(0)<<''<<v2.get(1);
输出我们想要的00 00
vector v2=v;
vector v2{v};
上面两个相同