如果初始化列表总是被处理为构造函数体,但它出现在我的代码中

If init lists always be processed to constructor body, but it appears else in my code

所以,我读到了这个: Will the initialization list always be processed before the constructor code?

并给出以下构造函数:

public:
    A (int x=5):x(x+1)
    {
        cout << "In A::A x= " << x << endl;
    }

和主要代码示例:

A a1(10);

我不明白结果: "In A::A x = 10" 根据我的逻辑应该是: "In A::A x = 11"

但是,x = 11 只有在调用构造函数体之后。这是为什么?

x 在构造函数的主体中表示参数 x.

x(x+1)中的第一个x是您class A的成员字段。这就是混乱的根源。

您应该为您的成员字段指定另一个名称。一些约定以 _m_.

开头
class A {
private:
    int m_x;
public:
    A (int x=5):m_x(x+1)
    {
        cout << "In A::A x= " << m_x << endl;
    }
};

A a(10); 的情况下,您的构造函数将编写 11.

这段代码的"problem"是构造函数的参数和成员变量都命名为x。也就是说,x 可能不是您期望的 x

在这种情况下,x 指的是构造函数的参数 - 其值为 10。原因是当 C++ 遇到有两个具有相同标识符的变量的作用域时,则最本地范围获胜。此处:参数值中的 x。如果要使用 memver 变量,请将代码更改为使用 this.x 而不是 x:

A (int x=5):x(x+1)
{
    cout << "In A::A x= " << this->x << endl;
}

现在看到的值应该是11,而不是10。this是指向当前对象的指针,所以this->x是对象的成员变量x的值当前对象。

当然,还是用不同的名字更好。这样你就可以避免这种混淆。