如果我有如下函数:
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
在实践中,标准明确允许复制构造函数是 优化掉(这称为复制省略)和要成为的值 就地 build 。那可能最终看起来像这样:
void fillStack(stack&);
int main() {
stack s;
fillStack(s); // with reference
}
尽管如此,复制构造仍然必须是良构的,即使 编译器应用此转换。如果复制构造可以有 这种优化的副作用可能会导致一些奇怪的行为(尝试 从复制构造函数打印一些东西并观察行为 在不同的优化级别上)。
这种优化在 C++11 中变得非常不必要,因为 移动语义。
关于c++ - 从函数返回时,构造函数和析构函数多久被调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894311/