C++ 函数调用中的堆栈对象何时构造?

C++ 函数调用中的堆栈对象何时构造?,c++,stack,object-construction,C++,Stack,Object Construction,假设我有一个简单的函数: void foo(int val) { if(val == 0) { return; } else { stringstream ss; ss << "Hello World" << endl << ends; cout << ss.str(); } } void foo(int val){ 如果(val==0){ 返回; } 否则{ 细流s

假设我有一个简单的函数:

void foo(int val) {
    if(val == 0) {
       return;
    }
    else {
      stringstream ss;
      ss << "Hello World" << endl << ends;
      cout << ss.str();
   }
}
void foo(int val){
如果(val==0){
返回;
}
否则{
细流ss;

ss这正是C/C++中作用域的用途:不要构造您不想构造的对象

在这里,您的
stringstream
对象只有在您穿透
else
花括号定义的范围时才能构造


因此,如果
val==0,则不会构造对象,因为程序不会运行到此点,所以不会构造此stringstream。

不,
ss
不会构造,因为它位于从未输入的不同范围内。很容易判断:只需放置您编写的类,而不是
stringstream
(例如扩展
stringstream
),并让其构造函数和析构函数输出一些消息。通过这种方法,您可以找到每个对象被创建和析构函数的确切时刻。@axiac,这是一个聪明的把戏。下次我想看看对象是否被构造时,我会试试这个把戏。@PentiumPro200“这是一个聪明的把戏”嗯,最简单的方法往往是最聪明的方法。