带有成员初始化列表的C ++ struct构造函数

时间:2016-02-11 00:39:21

标签: c++

我遇到了一个带有构造函数的C ++结构定义。

struct Foo                                                                                                                                                                                                                                   
{
    int x;

    Foo( int _x ) : x(_x)
    {   

    }   
    ~Foo()
    {   
        std::cout << "Destructing a Foo with x=" << x << "\n";
    }   
};

我知道有关会员初始化程序的信息,但是并不完全明白_x的含义?有人可以赐教我吗?

3 个答案:

答案 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;的前缀或后缀成员变量,例如_xx_

它并不常见,但您会发现一些开发团队总是使用前缀消除歧义功能参数:

class Foo {
    int m_x; // member x
public:
    Foo(int _x) : m_x(_x) {}
    int x() const { return m_x; }
};

这种方法的优点是:你可以使用小写的成员函数名称,这些名称不会与参数发生冲突,因此你可以让getter不以&get 39#为前缀。