在" {}"之前声明变量使用":"在类构造函数中

时间:2016-11-08 03:46:35

标签: c++ class c++11

我一直在翻阅SFML蓝图书,开始让我的脚在图形中弄湿。我注意到他们的游戏类构造函数中的一个代码示例:

kill -- -$(ps -o pgid= $PID | grep -o [0-9]*)

_window(sf :: VideoMode(800,600)," SFML标题")放在{}之前,而不是放在内部。这是不好的做法吗?这叫做什么?我还是c ++的新手,但我还没有遇到过这样的事情。

2 个答案:

答案 0 :(得分:2)

  

这是不好的做法吗?

不,这是一个很好的做法。如果成员是const限定类型或引用类型,则它是在构造函数中初始化该成员的唯一方法。

  

这是做什么的?

它被称为member initializer lists

答案 1 :(得分:1)

这称为成员初始化列表。它们是C ++语言的一部分。成员初始化列表允许您在类初始化期间初始化成员。他们是良好实践的一个原因是因为他们允许您在分配时初始化const成员不起作用。例如,以下类定义不起作用,因为const int member1未使用值初始化,也不能分配给const int,因为const使其成为只读。

class Game{
private:
    const int member_var; //won't work, needs to be initialized
    int member_var2;
public:
    Game() {} //Game constructor
}; 

使用初始化列表,您可以通过在构造函数定义之后添加冒号(但在括号之前定义它)并根据需要初始化成员来初始化const成员,如这些和其他变量初始化(使用“()”)或统一初始化(使用“{}”)。要初始化多个成员,请用逗号分隔。

class Game{
private:
    const int member_var; 
    int member_var2;
public:
    Game(): member_var(1), member_var2(2) {} 
    //Uniform initialization is ": member_var{1}, member_var{2}" 
};

在您的示例中,Game()构造函数在类定义之外(可能在另一个.cpp文件中)通过Game::Game()和成员初始化列表定义。我猜_window是一个带有一个构造函数的类,它以sf::VideoMode(800,600)"SFML Title"作为参数。