gpt4 book ai didi

c++ - 为什么在声明对象时既不执行构造函数也不执行赋值运算符?

转载 作者:太空狗 更新时间:2023-10-29 19:47:02 24 4
gpt4 key购买 nike

测试程序是

#include <iostream>
using namespace std;

class A
{public:
A (): I(0) {cout << "default construcot" << endl; };
explicit A (int i): I(i) {cout << "another construcot" << endl; };
A (const A& a): I(a.I) {cout << "copy constructor" << endl; }
A& operator = (const A& a)
{cout << "assignment operator" << endl;
if (this == &a) return *this;
I = a.I;
return *this;
}
void show () {cout << I << endl; };
private:
int I;
};

int main ()
{A a = A(1);
A b;
b = A(2);
a.show();
b.show();
return 0;
}

输出

another construcot
default construcot
another construcot
assignment operator
1
2

表明,与“b”不同的是,对象“a”是“直接”从 A(1) 构造的,没有执行赋值运算符。但是复制构造函数也没有执行。为什么?在这种情况下有没有办法强制执行赋值运算符?如果我写的话,我会预料到这样的行为

A a (1);

但是我想要

A a = A(1);

这必须与第一种情况不同。还是不行?

(事实上,当我有一个从 A 派生的类 B 并希望 A 的赋值运算符处理像 A a = B(...) 这样的声明时,问题就出现了。)

最佳答案

这个

A a = A(1);

不等同于:

A a;
a = A(1);

在第二种情况下 = 是一个运算符,在第一种情况下 = 不是一个运算符。在第一条语句中,它是一个初始化语法。编译器可能会调用复制构造函数,但它可以优化它,因为它是语言允许的地方之一(RVO、异常抛出等...)。

关于c++ - 为什么在声明对象时既不执行构造函数也不执行赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4541157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com