C++:初始化列表/命名约定
问题描述:
以下代码可以在我的机器上运行,但这是否是良好的做法/保证能够正常工作?C++:初始化列表/命名约定
struct MyStruct {
MyStruct(int x, int y, int z) :
x(x),
y(y),
z(z) {
}
int x;
int y;
int z;
};
具体来说,是x(x)保证做我想要的吗? (也就是说,它在初始化列表中的变量总是看那个结构/类的成员?)
我不想用开头或结尾下划线因为x是结构的公共成员。
谢谢!
答
是的,这是保证你的期望。
,可以存在“外”括号中的初始化列表的唯一的事情是成员变量。在括号内,通常的规则适用;局部变量隐藏成员变量。
至于是否是很好的做法,那么,考虑一下,如果你不小心删除从构造函数参数列表中的一个或多个参数会发生什么。该代码仍然会编译好!但它会在运行时发生可怕的破裂。不过,我仍然经常使用这种模式。
答
是,X(X)不正是你想要的。 X(x)是所述部件的名称,和x(X)是形式参数。
答
虽然希望你做什么,想象这种情况推而广之:
class MyStruct {
public:
MyStruct(int x, int y, int z)
: x(x),
y(y),
z(z)
{ }
int x() const;
int y() const;
int z() const;
private:
int x;
int y;
int z;
};
这将无法正常工作。这就是为什么我用我的班级成员加上m_
。这允许非常可读的代码向读者提示所讨论的标识符是类的一部分。非前缀标识符是函数参数(如在构造函数初始化程序列表中:m_x(x)
或函数局部变量)。
尽管编译器做的是正确的事情,但任何查看代码的人都会感到困惑。如果这种类型比您所展示的更复杂,并且您为此添加了十年和三代程序员维护,它几乎肯定会变得一团糟。 – sbi 2011-01-30 18:30:09