从函数返回时,构造函数和析构函数的调用次数是多少?

时间:2012-12-15 17:07:49

标签: c++ copy-constructor

如果我有以下功能:

stack fillStack(){
  stack a;
  return a;
}

void main(){
  stack s=fillStack();
}

考虑我们有一个名为stack的班级。 将调用多少构造函数和析构函数?

2 个答案:

答案 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