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

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

本文关键字:代码 我的 函数体 列表 初始化 处理 如果      更新时间:2023-10-16

所以,我读了这个:初始化列表总是在构造函数代码之前处理吗?

并给出以下构造函数:

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

和main中的代码示例:

A a1(10);

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

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

这段代码的"问题"是构造函数的参数和成员变量都命名为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的值。

当然,使用不同的名称会更好。这样可以避免这样的混淆。

x在构造函数体中表示参数x

x(x+1)中的第一个xclass 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 .

相关文章: