C++ C++;:初始化列表/命名约定
以下代码在我的机器上工作,但它是否是良好的实践/保证工作C++ C++;:初始化列表/命名约定,c++,list,initialization,naming,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)保证做我想做的事吗?(也就是说,初始化列表中的变量是否始终查看该结构/类的“成员”) 我不想使用前导下划线或尾随下划线,因为x是结构的公共成员 谢谢 是的,这
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建议?@CătăLinaîrbu:这几乎是十年前的事了。后来我改变了主意<代码>:-/代码仍然可以很好地编译我试过这个,但我不明白为什么。你说过括号外有成员变量。如果从构造函数列表中删除参数,则表示局部变量不再存在。这是否意味着MyStruct(intx,inty):x(x),y(y),z(z){}
将对z
成员执行什么操作?