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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |