【问题标题】:Re-declaring object in a for loop - C++在 for 循环中重新声明对象 - C++
【发布时间】:2018-03-28 14:45:35
【问题描述】:

我确实对循环中的变量重新声明有疑问。

为什么在foor循环中声明对象不会触发重声明错误?

对象是否在循环的每次迭代中被销毁并重新创建?

我正在插入示例代码

class DataBlock {
    int id;
    string data;
public:
    DataBlock(int tid=0,const string &tdata=""){
        id=tid;
        data=tdata;
    }
}

int main(int argc, char *argv[]){
    ifstream file;
    int temp_id;        //temporary hold the the id read from the file
    string temp_data;   //temporary hold the data read from the file

    set <DataBlock> s;

    //check for command line input here
    file.open(argv[1]);

    //check for file open here
    file >> temp_id >> temp_data;
    while (!file.eof()){
        DataBlock x(temp_id,temp_data);   //Legit, But how's the workflow?
        s.insert(x);
        file >> temp_id >> temp_data;
    }
    file.close();
    return 0;
}

【问题讨论】:

  • 在循环的每次迭代中,对象会被销毁并重新创建吗?
  • @Michele Fattoruso 这个声明集 s;没有意义,因为没有为 DataBlock 类定义比较器。
  • @VladfromMoscow 我没有将所有代码都包含在重载的运算符中,因为它不会为所问的问题添加额外的信息,而只会使代码混乱,让人们阅读更多行。我确实为该类重载了比较运算符。

标签: c++ loops variable-declaration


【解决方案1】:

为什么在foor循环中声明对象不会触发重声明错误?

当您在同一范围内两次(或多次)声明相同的名称时,会发生重新声明错误。看起来像

int i = 5;
int i = 6; // uh oh, you already declared i

在你的循环中你没有那个,你只有

loop
{
    int i = 5;
}

所以没有重新声明。

你也可以

int i = 5
{
    int i = 6;
    std::cout << i;
}

并且不会出现重新声明错误,因为变量位于不同的范围内,并且您可以在多个范围内拥有相同的变量。在这种情况下,6 将被打印,因为i 是范围内的i

对象是否在循环的每次迭代中被销毁并重新创建?

是的。将循环视为多次调用的函数。当您进入循环/函数的主体时,其中声明的变量将被构造1,而当您到达循环/函数的末尾时,变量将被销毁。

1:这有点复杂,但我们不需要在这个答案中深入了解所有这些细节

【讨论】:

  • 感谢您的回答。这证实了我的想法。我找不到任何相关信息。
  • 您可能需要澄清变量声明在同一范围内。 {} 引入了一个新的作用域,因此允许声明相同的变量。
  • @ThomasMatthews 我已经更新了答案。你怎么看?
【解决方案2】:

为什么在foor循环中声明对象不会触发重声明错误?

不,它没有。

每次 for 循环迭代时,都会进入一个新的作用域,并且在前一个作用域中创建的对象被破坏并释放它们的存储分配。

for (int i=0 ; i<2 ; ++i) {
    MyClass c;
}

就像:

{
    int i=0;
    {
        MyClass c; // c(0)
    } // c destructed, storage allocation freed
    ++i;
    {
        MyClass c; // c(1)
    } // c destructed, storage allocation freed
    ++i;
}

c(0)c(1) 确实共享相同的名称,但在范围内没有重叠。一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多