c++ - 关于C++对象构造和范围的问题

标签 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 << "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/

相关文章:

Javascript 构造函数与对象字面量混淆

Java - 子类调用 super 构造函数,它调用子类方法而不是它自己的方法

c++ - 完美转发构造函数和删除构造函数

javascript - 如何在 jQuery .each() 函数中访问变量?

Javascript:始终在执行上下文中执行函数

c++ - 我创建了一个库,想知道设计是否效率低下

c++ - tcp 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据

c++11可变参数模板方法完全影子基类方法?

c++ - 嵌套循环中迭代器的行为与 C++ 中的随机访问

JavaScript 将变量值公开