当我给有复制构造函数但没有赋值运算符的对象赋值时会发生什么

What happens when I make a assignment to object which has copy constructor but no assignment operator?

本文关键字:赋值 对象 什么 赋值运算符 复制 构造函数      更新时间:2023-10-16

当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么
它会调用编译器的赋值运算符来执行成员复制吗?

所有类都有一个赋值运算符,除非显式删除它(在C++11之前是不可能的)。如果您不提供自己的实现,编译器将为您提供一个实现。

这就是三规则背后的主要原因:如果你有一个复制构造函数,那么几乎可以肯定的是,你也需要一个赋值运算符和一个析构函数。

复制构造函数在赋值中不起作用,将调用默认的赋值运算符,该运算符将对内置类型成员进行逐位复制,并对class类型的对象成员调用赋值运算符。

是的,如果您不提供默认的赋值运算符生成器,您将通过编译器访问它。

但一般来说,如果一个类定义了以下内容之一,它可能应该明确定义所有三个

  • 析构函数
  • 复制构造函数
  • 复制分配运算符

我不知道你所说的赋值(在编译器的上下文中)是什么意思。所以,让我举个例子。假设我们有一个班级测试;

Test a,c;          //default constructor would be called for both.
Test b = a;        //copy constructor would be called for b as we are creating that object.
c = b;             //assignment operator would be called for c as we are changing content's of c.

所以,若类Test包含普通对象,那个么无论您是否定义编译器都不会为您进行逐位复制。但是,如果您的类包含指针,那么您应该显式定义复制构造函数、赋值运算符和析构函数。

希望我足够清楚。