1

如果我在循环中使用以下内容:

    ostringstream glob;
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;

每次迭代都会重置 glob。但是,如果我在循环之外声明 glob,那么每次迭代都会不断添加“一些单词”,从而导致字符串越来越长。

我试图理解为什么。这是因为每次循环循环时都会从堆栈中弹出这个变量吗?

我认为如果我在每个循环中“重新定义”glob,那么我会得到一个错误,但我没有......

4

3 回答 3

3

如果您在范围内声明变量,则每次进入循环时都会创建(构造)它(它在堆栈上)。如果您在循环之外声明它,那么它就是您不断重用的单个实例。

也可以看看:

于 2012-06-19T20:25:04.613 回答
2

为了澄清,您在询问这之间的区别:

ostringstream glob;
for ( int i = 0; i < 100; ++i )
{
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;
}

还有这个:

for ( int i = 0; i < 100; ++i )
{
    ostringstream glob;
    glob << "some words";
    cout<< "this is bob"<<glob.str()<<endl;
}

首先,“glob”在循环之前被初始化一次,因为它的范围在循环体之外。第二个“glob”在循环体中(在定义循环范围的大括号内),因此新放置在堆栈上并在每次迭代时初始化(并在每次迭代结束时销毁)。

于 2012-06-19T20:28:44.300 回答
0

当 glob 在循环内时,它的作用域是循环的每次迭代。因此,它将在超出范围时被删除(从堆栈中弹出),并在下一次迭代中重新创建(推入堆栈)。

当 glob 在循环之外时,它的作用域是方法,并且在方法完成之前不会被删除。

于 2012-06-19T20:26:10.103 回答