テストプログラムはなぜオブジェクトを宣言するときにコンストラクタも代入演算子も実行されませんでしたか?
#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' とは異なり、そのオブジェクトは、代入演算子の実行せずに(1) "直接" から構築しました。しかしコピーコンストラクタも実行されていませんでした。どうして?この場合、代入演算子を強制的に実行する方法はありますか?私は
A a (1);
を書いた場合、私はそのような行動を期待しますが、私は最初のケースとは異なりする必要が
A a = A(1);
をしたいです。か否か?
(私はAから派生したクラスBがあり、A = B(...)のような宣言を処理するために、Aの代入演算子をしたい時に実際には、問題が表示されます。)
コンパイラライターは、代入演算子/コピーコンストラクタへの不要な呼び出しを取り除くのに十分にスマートでした。 – DumbCoder
なぜあなたは自己への割り当てを気にしますか?(この==&a) 'クラスはそれほど単純ではありません。それがもっと複雑な場合は、コピーとイディオムを使用する必要があり、それでテストは冗長になります。 –