C ++:初始化列表/命名约定

时间:2011-01-30 18:19:13

标签: c++ list initialization naming

以下代码适用于我的机器,但这是一种良好的做法/保证可以正常工作吗?

struct MyStruct {
   MyStruct(int x, int y, int z) :
       x(x),
       y(y),
       z(z) {
   }

   int x;
   int y;
   int z;
};

具体来说,x(x)保证做我想要的吗? (也就是说,初始化列表中的变量是否始终查看该struct / class的成员?)

我不想使用前导或尾随下划线,因为x是结构的公共成员。

谢谢!

3 个答案:

答案 0 :(得分:11)

是的,保证按照您的期望行事。

初始化列表中括号内“唯一”可以存在的是成员变量。在括号内,通常的规则适用;局部变量隐藏成员变量。

关于这是否是一种好的做法,请考虑如果您不小心从构造函数参数列表中删除了一个或多个参数会发生什么。代码仍然可以正常编译!但它会在运行时突然崩溃。尽管如此,我仍然经常使用这种模式。

答案 1 :(得分:2)

虽然它期望你做什么,但想象一下这种情况的扩展:

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)或函数局部变量)。

答案 2 :(得分:0)

是的,x(x)完全符合您的要求。 x (x)是成员的名称,x( x )是正式参数。