这有点难以用语言表达,这是片段,
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;
}
这给出了正确的输出
inner scope
10
outer scope
5
但是如果我这样做,
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;
}
这会引发运行时异常,并给出错误的输出,
inner scope
-858993455
outer scope
5
我觉得这似乎与复制构造函数和赋值构造函数的调用顺序不同有关,但我不太确定,请赐教。
最佳答案
当你隐藏一个变量时,你会删除该范围内它的所有痕迹,因此:
int i = i;
这声明了i
等于它的(未初始化的)自身。该变量完全独立于父作用域的i
。这实际上是未定义的行为。
奇怪的是,int i(i)
方法使用父作用域的 i
来初始化,尽管它的工作原理相当奇怪。但它可能不是定义的行为。
如果您需要以某种方式将这两个变量关联起来,您应该使用不同的变量名称。如果没有相互依赖性,您可以进行影子操作。
换句话说:
int j = i;
关于c++ - 关于C++对象构造和范围的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63715908/