【问题标题】:Whats this way of implementing a method in c++? [duplicate]在 C++ 中实现方法的这种方式是什么? [复制]
【发布时间】:2020-08-02 16:55:10
【问题描述】:

我想使用 C++ SFML 库创建一个游戏类。 我尝试使用 OOP 编码风格,但我对我在学习书中找到的代码感到困惑,如下所示:

#include <SFML/Graphics.hpp>


class Game
{
public:
    Game();
    void run();

private:
    void proccessEvent();
    void update();
    void render();

private:
    sf::RenderWindow mWindow;
    sf::RectangleShape rect;

};

Game::Game()
: mWindow(sf::VideoMode(640, 480), "SFML Application") , rect()
{
    rect.setSize(sf::Vector2<float>(100.0f,100.0f));
    rect.setFillColor(sf::Color::Red);
}

我不明白 Game::Game 部分发生了什么。有人可以向我解释那部分的 : 是什么吗??

【问题讨论】:

  • 这是一个初始化列表。它用于初始化类的成员。这是基本的 C++,在任何 C++ 书籍的早期都有介绍,但令人惊讶的是有多少新手从未见过它。我猜人们不阅读 C++ 书籍。
  • 你真的应该先开始阅读一本好的 c++ 书籍,学习该语言的基础知识,然后再寻找在线教程,或者在不了解该语言的基本概念的情况下编写代码。如果没有这些基本知识,您将无法确定教程显示是否正确,并且您可能会得出错误的结论。 StackOverflow(以及大多数其他在线平台和教程)是一本好书的替代品。

标签: c++ c++11 sfml game-development


【解决方案1】:

称为成员初始化列表。见:https://en.cppreference.com/w/cpp/language/constructor

默认情况下,类的数据成员在对象本身之前初始化。可以像这样定义相同的构造函数实现:

Game::Game()
{
    mWindow = RenderWindow(sf::VideoMode(640, 480), "SFML Application");
    rect = RectangleShape();
    rect.setSize(sf::Vector2<float>(100.0f,100.0f));
    rect.setFillColor(sf::Color::Red);
}

但这一次,mWindowrect 将首先使用它们的默认构造函数进行初始化,然后在构造游戏对象期间调用它们的复制赋值运算符来分配它们的值。

如果你使用成员初始化器列表,它们的构造器会被调用一次。这样会更有效。

【讨论】:

  • 这不准确。构造函数只被调用一次,在上面的替代代码中,它是调用以将值分配给成员的 赋值运算符
  • @john 更准确地说,调用了两个 RenderWindow 构造函数。默认构造函数和 RenderWindow(sf::VideoMode(640, 480), "SFML Application"); 使用的任何构造函数。然后,将第二个实例移动分配给mWindow
  • 是的,但是在这种情况下,成员类型的构造函数仍然被调用了两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多