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

Declaring variables before "{}" using ":" in class constructer

本文关键字:声明 变量 构造函数      更新时间:2023-10-16

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

Game::Game() : _window(sf::VideoMode(800,600), "SFML Title") {
     code code code...
}

_window(sf::VideoMode(800,600), "SFML Title")放在{}之前,而不是在里面。这种做法不好吗?这叫什么?我还是c++的新手,但我还没有遇到过这样的东西

这种做法不好吗?

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

这叫什么?

它叫做成员初始化列表

这叫做成员初始化列表。它们是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()构造函数是通过带有成员初始化列表的Game::Game()在类定义之外定义的(可能在另一个.cpp文件中)。我猜_window是一个类与一个构造函数,以sf::VideoMode(800,600)"SFML Title"作为参数。