2016-11-08 48 views
1

我一直翻阅SFML蓝图书籍,开始在图形中弄湿我的脚。我在他们的代码范例之一注意到他们的游戏类的构造函数:在“{}”之前在类构造器中使用“:”声明变量

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

_window(SF :::视频模式(800,600), “SFML标题”)放在前{},而不是内部。这是不好的做法吗?这是干什么的?我仍然是新来的C++,但我还没有遇到过这样的事情。

+2

这是一个很好的做法,它被称为[成员初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list) – Danh

回答

2

这是不好的做法?

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

这是干什么的?

这就是所谓的member initializer lists

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"作为参数。

相关问题