如果我有以下功能:
stack fillStack(){
stack a;
return a;
}
void main(){
stack s=fillStack();
}
考虑我们有一个名为stack
的班级。
将调用多少构造函数和析构函数?
答案 0 :(得分:3)
以下是应该正在发生的事情:
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-constructor中打印一些东西并观察行为 在不同的优化水平上。)
由于C ++ 11,这种优化在很大程度上变得不必要了 移动的语义。
答案 1 :(得分:0)
假设没有编译器优化,它应该是2个复制构造函数调用 - 一个从函数本地到返回值临时,一个从返回值临时到s