当您多次声明相同的对象/变量时会发生什么(新手)

joh*_*ohn 0 c++

这样的事情做什么?

static int i;

// wrapped in a big loop
void update_text()
{
    std::stringstream ss; // this gets called again and again
    ++i;
    ss << i;
    text = new_text(ss.str()); // text and new_text are defined elsewhere
    show_text(text); // so is this
}
Run Code Online (Sandbox Code Playgroud)

是用新地址和所有东西在堆栈中创建一个新的ss实例?将sprintf与char数组一起使用会更聪明吗?

Sio*_*vok 6

每次调用该函数std::stringstream ss时,都会在堆栈上推送一个新的本地实例.在函数结束时,此实例将被销毁并从堆栈中弹出.

在任何时候,函数的范围update_text都在其范围内具有多个变量和标识符ss.因此,在范围内update_text,只有一个ss标识符.

字符数组没有区别.每次调用该函数时,char数组(如果静态分配)将被压入堆栈并在结尾处弹出.如果使用动态内存并动态分配字符数组,则每次调用函数时仍会执行newdelete语句,并且仍然会推送指向此字符数组的指针并从堆栈中弹出.在std::stringstream已经处理new,并delete为你的内部.

多次声明一个对象看起来像这样:

void Function()
{
    int x;
    int x;
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译器错误.

请注意,这是有效的:

void Function()
{
    int x;
    if(true)
    {
        int x;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为这两个变量的范围不同.第二个x仅存在于该if声明中.因此,编译器可以推断x在该声明之后和该范围内的任何引用都是指第二个引用x.请注意,类型无关紧要,重要的是标识符或"名称".