我遇到了一个带有构造函数的C ++结构定义。
struct Foo
{
int x;
Foo( int _x ) : x(_x)
{
}
~Foo()
{
std::cout << "Destructing a Foo with x=" << x << "\n";
}
};
我知道有关会员初始化程序的信息,但是并不完全明白_x
的含义?有人可以赐教我吗?
答案 0 :(得分:2)
它表示名为“_x”的变量。下划线可以在变量的名称中使用,例如字母,尽管名称以下划线开头的标识符具有长期约定,因为它是为编译器库保留的。
int _x;
意味着同样的事情
int x;
装置。或者“int a;”,“int b;”或int
任何东西。 C和C ++中的变量名称可以以下划线或字母开头,并由下划线,字母和数字组成。虽然,正如我所说,应避免使用前导下划线,因为它们通常保留供编译器库使用。
答案 1 :(得分:2)
这不是特殊或魔法语法。带前缀的struct Foo {
int x;
Foo( int x ) : x(x) {}
};
用于区分构造函数参数和成员变量符号。就是这样。
使用像
这样的定义{{1}}
只是模棱两可的范围明智。
答案 2 :(得分:0)
Foo( int _x ) : x(_x)
{
}
这是一个构造函数,它接受一个整数,然后用它来初始化成员变量x
的值。
Foo f(5);
// -> f.x = 5
下划线的原因是消除函数参数与其所分配的变量之间的歧义。
YMMV:许多开发团队使用类似的策略:
。使用&#34; m _&#34;前缀所有成员变量,
。使用&#34; _&#34;的前缀或后缀成员变量,例如_x
,x_
,
它并不常见,但您会发现一些开发团队总是使用前缀消除歧义功能参数:
class Foo {
int m_x; // member x
public:
Foo(int _x) : m_x(_x) {}
int x() const { return m_x; }
};
这种方法的优点是:你可以使用小写的成员函数名称,这些名称不会与参数发生冲突,因此你可以让getter不以&get 39#为前缀。