如果初始化列表总是被处理到构造函数体,但它出现在我的代码
If init lists always be processed to constructor body, but it appears else in my code
所以,我读了这个:初始化列表总是在构造函数代码之前处理吗?
并给出以下构造函数:
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)
中的第一个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
.
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 我的代码运行良好,但在游戏循环中中断
- 8谜题代码.我的队列没有填充,我找不到错误的位置