类的拷贝构造函数中传递的类参数,一定是引用类型,不能采用值传递类型。 如下:
class Person
{
public:
Person(int id): m_id(id) {}
Person(const Person &per1) //拷贝构造函数。
{
m_id = per1.getId();
}
~Person() {}
int getId() const { return m_id; }
private:
int m_id;
};
int main()
{
Person p1(0);
int one = p1.getId();
Person p2 = p1;
return 0;
}
上面的程序可编译过。但是下面将拷贝构造函数的参数更换为传值类型,那么就无法编译成功。
class Person
{
public:
Person(int id): m_id(id) {}
Person(const Person per1) //拷贝构造函数。
{
m_id = per1.getId();
}
~Person() {}
int getId() const { return m_id; }
private:
int m_id;
}
这段代码在Visual Studio和GCC中都无法编译成功[1]。即使编译成功了,也会产生错误。因为在调用拷贝构造函数时,会产生无限调用的情况,最终导致栈空间溢出。
拷贝构造函数的使用情况
- 用一个对象来初始化另一个对象,如上面的p2=p1;
- 函数参数是一个对象时,因为传实参会进行复制,所以会调用拷贝构造函数,如上面的Person(const Person per1);
- 函数体内部返回一个对象时;
参考
[1] https://blog.youkuaiyun.com/qq_35409955/article/details/72356370