次のような関数があるとします。
stack fillStack(){
stack a;
return a;
}
void main(){
stack s=fillStack();
}
というクラスがあるとしstack
ます。コンストラクタとデストラクタはいくつ呼び出されますか?
次のような関数があるとします。
stack fillStack(){
stack a;
return a;
}
void main(){
stack s=fillStack();
}
というクラスがあるとしstack
ます。コンストラクタとデストラクタはいくつ呼び出されますか?
これが起こっているはずです:
stack fillStack() {
stack a; // constructor
return a; // copy constructor and destructor a
}
int main(){
stack s=fillStack(); // copy constructor and destructor of the temporary
} // destructor s
実際には、標準では、コピー コンストラクターを最適化して取り除き (これはcopy elisionと呼ばれます)、値をその場で構築することを明示的に許可しています。それは次のようになります。
void fillStack(stack&);
int main() {
stack s;
fillStack(s); // with reference
}
ただし、コンパイラがこの変換を適用したとしても、コピー構築は整形式でなければなりません。copy-construction に副作用がある場合、この最適化はやや奇妙な動作につながる可能性があります (copy-constructor から何かを出力してみて、さまざまな最適化レベルでの動作を観察してください)。
この最適化は、移動セマンティクスにより、C++11 ではほとんど不要になります。
コンパイラの最適化がないと仮定すると、それは 2 つのコピー コンストラクター呼び出しになるはずです。s