c++ - 从函数返回时,构造函数和析构函数多久被调用一次?

标签 c++ copy-constructor

如果我有如下函数:

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/

相关文章:

c++ - 为什么复制构造函数在下面的代码中被调用了两次?

c# - 如何调用函数序列?

objective-c - Objective-C 中复制方法与复制构造函数的参数

C++ 复制指针指向的数据

c++ - feof() 如何真正知道何时到达文件末尾?

c++ - 如何在 Allegro 的屏幕上从键盘输入?

c++ - CMake Boost 链接问题

c++ - 重载 = 运算符和名称隐藏

c++ - 让子类在构造函数中接受对父类的引用

visual-studio-2008 - VC2008中的自动指针构造函数