Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于c+的问题+;对象结构和范围_C++_Constructor_Scope - Fatal编程技术网

C++ 关于c+的问题+;对象结构和范围

C++ 关于c+的问题+;对象结构和范围,c++,constructor,scope,C++,Constructor,Scope,这有点难以用语言表达,以下是片段 int main() { int i = 5; { int i(i); i = i+5; // int i = i; // i = i + 5; cout << "inner scope" << endl; cout << i << endl; } cout <&l

这有点难以用语言表达,以下是片段

int main() {
    int i = 5;
    {
        int i(i);
        i = i+5;
//        int i = i;
//        i = i + 5;

        cout << "inner scope" << endl;
        cout << i << endl;
    }
    cout << "outer scope" << endl;
    cout << i << endl;
}
但如果我这样做

int main() {
    int i = 5;
    {
      //int i(i);
      //i = i+5;
        int i = i;
        i = i + 5;

        cout << "inner scope" << endl;
        cout << i << endl;
    }
    cout << "outer scope" << endl;
    cout << i << endl;
}

我觉得这似乎与复制构造函数和赋值构造函数的调用顺序不同有关,但我不能完全确定,请告诉我。

当你对变量进行阴影处理时,你会删除该范围内的所有跟踪,因此:

int i = i;
这声明
i
等于其(未初始化)自身。此变量完全独立于父作用域的
i
。这实际上是未定义的行为

奇怪的是,
inti(i)
方法使用父作用域的
i
进行初始化,尽管这是相当奇怪的。但这可能不是行为的定义

如果需要以某种方式将这两个变量关联起来,则应该使用不同的变量名。如果不存在相互依赖,则可以使用阴影

换言之:

int j = i;

对于第二个,我得到了
警告:“I”是未初始化使用的[-Wuninitialized]
。Wildgues(可能是错误的)是,这是因为事情的顺序。在
inti(i)
中,您使用存在于内部循环中的outter i来构造新的i。在
int i=i
中,首先创建一个变量i,然后尝试将其分配给i,这显然不是外部i,因为内部i已经定义。(和叮当声)对这两种情况都给出未初始化的警告。@songyuanyao您没有为外部范围初始化j,但该点仍然有效。@tesla1060我想这是,任何事情都是可能的。那么我们不能说这是一个bug,编译器可以做任何他们想做的事情
inti=i相同用于此目的。两者都是UB。
int i = i;
int j = i;