构造函数、拷贝构造函数、赋值运算符

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();     //拷贝构造函数
}

拷贝构造函数和赋值运算符有些相似,他们的区别是:

拷贝构造函数是创建一个新的对象,赋值运算符是将对象赋值给一个已经存在的对象。

二者的区别就在于被赋值的对象是否已经被初始化(是否已经存在)。

原文地址:https://www.cnblogs.com/hosseini/p/15093733.html