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;