好的,我不是一个非常有经验的 C++ 程序员,但我想知道以下构造函数的参数中的下划线有什么意义?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
好的,我不是一个非常有经验的 C++ 程序员,但我想知道以下构造函数的参数中的下划线有什么意义?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
没什么特别的。他只是这样命名,以区分成员变量和参数名称。
下划线是 C++ 标识符中的有效字符。
这只是一个方便的命名约定,对语言没有任何意义。请确保您不要跟大写字母:双下划线 (__const) 在 C 中是什么意思?
最有可能的是,代码的作者试图避免初始化列表中数据成员名称和构造函数参数名称之间的潜在冲突。很可能,作者没有意识到 C++ 查找规则确保无论如何都不会发生冲突这一事实。即下面的代码也会产生预期的结果
class floatCoords {
public:
floatCoords(float x, float y, float width, float height)
: x(x), y(y), width(width), height(height)
{
}
float x, y, width, height;
...
尽管对于没有准备的读者来说,这可能会让人感到困惑。
当然,在构造函数体内,参数名称会隐藏成员名称,因此需要使用this->...
或限定名称来访问数据成员。代码的作者很可能也试图避免这种情况。
这些只是不同的人/机构假设的变量命名约定。乍一看这似乎没有必要,但实际上在读写代码时非常有用,尤其是当您有同名的参数和成员变量时。例如,您通常可以有以下三种情况:
class A {
void foo(int age_) { //parameter
int age = 18; //local scope
if (age_ > age) cout << legal << endl;
}
int _age; //member
};
在上面的例子中:
它们只是传入参数的名称。它们恰好匹配成员变量并用于初始化程序。
没有特殊含义 - 它只是某些人可能使用的约定。
它们没有句法意义。但是,如果您有一堆字段(例如x
、y
、width
和height
),通常的约定是使用字段名称加上前导下划线来命名初始化它们的构造函数参数。
这些下划线的目的是为了区分参数变量float _x
和成员变量float x
。在语法上,由于下划线,没有添加特殊含义。当我必须编写 C++ 代码时,我个人更喜欢为所有参数添加a_
前缀,并为所有成员变量添加前缀。m_
因此,当我遇到必须混合和匹配本地变量、成员变量和参数变量的情况时,我知道我正在处理哪些变量。
int y = a_x * 2;
m_x = y + 3;
因为如果您命名 den float x、float y 等,您将无法访问该类的实际字段,因为它们具有相同的名称。
它与语言无关,只是实际程序员的约定(我认为是为了使代码更明显)