C++中构建一个对象,有多种方式,例如下面的Person类:
class Person { public: Person(){}; ~Person(){}; };
1.调用构造函数:
Person per1 = Person();
2.调用拷贝构造函数,使用一个已有的对象创建:
Person per1 = Person(); Person per2 = Person(per1);
3.使用赋值运算符,将一个已有的对象赋值给另一个对象:
Person per1 = Person(); Person per2; per2 = per1;
在用户没有定义的情况下,编译器会为任意一个类提供一个默认的。
用户在定义类的时候,可以自己定义,也可以禁止生成拷贝构造函数、赋值运算符,禁止以后,在代码中就无法使用了:
class Person { public: Person(){}; ~Person(){}; Person(const Person &p) = delete; //禁止生成拷贝构造函数 Person & operator = (const Person & p) = delete; //禁止生成赋值运算符 };
void main()
{
Person per1 = Person();
Person per2 = Person();
per1 = per2;//错误
Person per3 = Person(per1)//错误
}
调用的场合:
void f1(Person p) { return; } Person f2() { Person per1 = Person(); return per1; } void main() { Person per1 = Person(); //默认构造函数 Person per2; //默认构造函数 per2 = per1; //赋值运算符 Person per3 = per2; //拷贝构造函数 f1(per3); //拷贝构造函数 Person per4 = f2(); //拷贝构造函数 }
拷贝构造函数和赋值运算符有些相似,他们的区别是:
拷贝构造函数是创建一个新的对象,赋值运算符是将对象赋值给一个已经存在的对象。
二者的区别就在于被赋值的对象是否已经被初始化(是否已经存在)。