拷贝构造函数

拷贝构造函数不能采用值传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
class S
{
int a;
public:
S(int x):a(x){}
S(S st){this->a=st.a;}//拷贝构造函数
};

int main()
{

S s1(2);
S s2(s1);//步骤1
return 0;
}

当执行步骤1的时候,会调用S2的拷贝构造函数,
由于是值传递,系统会给形参st重新申请一段内存,
然后调用st的拷贝构造函数,把s1赋值给st,
当调用st的拷贝构造函数的时候,又是值传递,又得重复上述步骤,
所以,会一直执行下去,形成一个死循环。

必须把拷贝构造函数改为常类型引用传递,
引用就是别名,不会重新申请内存,同时,我们在赋值运算符函数内不会改变传入的实例的状态,因此应该为传入的引用参数加上const关键字。

1
S(const S &st){this->a=st.a;}//拷贝构造函数