为什么这里不调用赋值运算符?
why isn't assignment operator called here?
编辑:对不起,我在原始帖子中使用了"赋值构造函数"而不是"赋值操作符"。现在固定。
在下面的代码中调用复制构造函数而不是赋值操作符。有人能告诉我这背后的原因吗?谢谢你。
class A
{
int i;
public:
A(int ii) { i = ii; }
A(const A& a) { i = a.i; i++; }
A& operator=(const A& a) { i = a.i; i--; }
};
int main(void)
{
A a(4);
A b = a;
return 0;
}
A a(4);
A b = a;
它们都不是赋值1。两者都是初始化。
第一个称为直接初始化,第二个称为复制初始化。
它们之间的区别在于,即使复制构造函数不可访问(即private
或protected
),第一个也可以工作,而第二个如果复制构造函数不可访问则不能工作。
尽管第二个要求复制构造函数是可访问的,但这并不意味着必须调用复制构造函数。允许编译器对其进行优化,因此可以完全省略对复制构造函数的调用。语义验证需要一个可访问的复制构造函数。
查看以下主题:
- 在c++中拷贝初始化和直接初始化有区别吗?什么时候应该使用直接初始化,什么时候应该使用复制初始化?
- c++拷贝初始化&直接初始化,奇怪的情况
<一口> 1。也没有这样的东西叫做赋值构造函数。一口>
operator=
不是"赋值构造函数",而是"赋值操作符"。
当您在定义中初始化变量时(如A b = a
中),根据定义,它相当于调用复制构造函数。例如,A b(a);
和A b = a;
是完全相等的。
相关文章:
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 为什么初始化时没有调用重载赋值运算符?
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 使用赋值运算符将宏转换为函数调用
- 从赋值运算符调用构造函数
- 赋值运算符重载在通过指针访问时不调用
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 在其赋值运算符方法中调用对象的析构函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 未调用移动赋值运算符
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- C++重载赋值运算符在不相关的类中被调用
- 不可调用项的示例赋值运算符
- 为什么在这种情况下调用复制构造函数和赋值运算符
- 为什么deque::erase()调用赋值运算符
- C++移动语义:为什么调用复制赋值运算符=(&)而不是移动赋值运算符=(&&)?
- 为什么在这里调用复制构造函数而不是普通的构造函数和重载赋值运算符
- C++ 不调用赋值运算符
- 我可以从子类以外的另一个类调用抽象基类的公共赋值运算符吗?
- 如果类类型是按值调用的函数的参数,则会调用该类的重载赋值运算符吗?