当我给有复制构造函数但没有赋值运算符的对象赋值时会发生什么
What happens when I make a assignment to object which has copy constructor but no assignment operator?
当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么
它会调用编译器的赋值运算符来执行成员复制吗?
所有类都有一个赋值运算符,除非显式删除它(在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包含普通对象,那个么无论您是否定义编译器都不会为您进行逐位复制。但是,如果您的类包含指针,那么您应该显式定义复制构造函数、赋值运算符和析构函数。
希望我足够清楚。
相关文章:
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 如何动态地为对象中的数据赋值?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 为什么可以使用已删除的移动构造函数和赋值运算符移动对象?
- 构造函数对象赋值是否泄漏内存
- 为什么对象可以"moved"甚至缺少移动构造函数和移动赋值运算符?
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 是否可以在C++(17)中捕获某些对象属性的破坏性赋值事件
- 具有临时对象的 Fundamenta 数据类型赋值运算符
- 如何重载 const 对象的 [],以便值赋值不会导致编译错误
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- C++ 指针赋值运算符重载(不仅是对象赋值,还有指针赋值)
- 使用赋值运算符功能按距离对数组对象进行排序
- 将派生类对象赋值和访问到基类 "pointer to pointer" C++ 中的对象
- 赋值运算符是否应观察赋值对象的右值?
- C++ 矢量从构造函数赋值对象,无需临时
- 通过引用赋值对象,而不复制
- 在c++中创建一个赋值对象
- 子函数中的已赋值对象未在父函数中更新