c – 为什么在声明对象时,构造函数和赋值运算符都没有执行?
|
测试程序是
#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).
这取决于你的编译器.但是我不知道有什么可以让你强迫这个(但我从来没有试过把它关掉).尝试关闭编译器正在执行的所有优化.
该标准明确指出您的版本可以优化到此.
如果你这样做,你将切片B并只分配B对象的A部分. A const& a = B(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
