拷贝构造函数和赋值运算符重载的区别

先看一个实例:

#include<iostream>
using namespace std;
class Demo
{
public:
    //构造函数
    Demo(int num)
    {
        m_num = num;
        printf("constructor\n");
    }
    //拷贝构造函数
    Demo(const Demo & demo)
    {
        m_num = demo.m_num;
        printf("copy constructor\n");
    }

	//赋值运算符重载
    Demo& operator=(const Demo& demo)
    {
        m_num = demo.m_num;
        printf("operator=\n");
        return *this;
    }

    //析构函数
    ~Demo()
    {
        cout<<"destructor\n";
    }
private:
    int m_num;
};
int main()
{
    Demo A(100); // 产生一个实例,调用一次构造函数
    Demo B=A;    // 调用拷贝构造函数,产生一个实例

    Demo C(20);  // 产生一个实例,调用一次构造函数
    C = A;	     // 调用赋值运算符重载
    return 0;
}

运行结果:三次构造三次析构

  

  在默认情况下(用户没有定义,但是也没有显示的删除),编译器会自动隐式生成一个拷贝构造函数和赋值运算符,但用户在新标准中可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算

调用时机:
 1)调用拷贝构造函数:创造一个新对象时(包括传参产生的临时对象和创建对象)

 2)调用赋值运算符:对象已经产生

发布了343 篇原创文章 · 获赞 57 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/jadeshu/article/details/103572297