如果初始化列表总是被处理为构造函数体,但它出现在我的代码中
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
的值当前对象。
当然,还是用不同的名字更好。这样你就可以避免这种混淆。
所以,我读到了这个: 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
的值当前对象。
当然,还是用不同的名字更好。这样你就可以避免这种混淆。