c++ - 我对这个 C++ 构造函数感到困惑

标签 c++ constructor

我尝试寻找答案,但不确定用于描述此问题的最佳术语...

我正在阅读一本关于 SFML 编程的书,其中一个示例让我对构造函数的用法感到困惑。

假设我们有 A 类和 B 类。A 类有一个 B 类型的成员变量 (memberB)。 A 的构造函数如下所示:

A::A() : OtherMemberType(with, params), memberB()
{...}

鉴于 memberB 正在初始化列表中使用默认构造函数进行初始化,在列表中显式列出它的目的是什么?如果不将其包含在列表中,会不会产生相同的效果?

谢谢

编辑:感谢您的回答。我现在已经了解了值初始化与默认初始化的(基本)区别。

关于更多上下文,由于提出了“B 类可能被破坏”的想法,这里是来自文本 SFML Game Development 的代码示例:

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

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

    private:
        sf::RenderWindow mWindow;
        sf::CircleShape  mPlayer;
};

Game::Game()
: mWindow(sf::VideoMode(640, 480), "SFML Application")
, mPlayer()
{
    mPlayer.setRadius(40.f);
    mPlayer.setPosition(100.f, 100.f);
    mPlayer.setFillColor(sf::Color::Cyan);
}

那么在这种情况下,有人知道 SFML 的一些细节吗? sf::CircleShape 是否“损坏”,或者这是对默认构造函数的冗余调用?

亚当

最佳答案

初始化初始化列表中的成员value-initializes它。从列表中省略它default-initializes它,

如果 B 是非聚合且有默认构造函数,则没有区别。

如果 B 是一个聚合,那么可能会有差异。 default-initializing 这意味着如果它包含内置函数,这些可能不会被初始化。 值初始化它最终会产生零初始化其成员的效果。

这是一个初始化语义不同的示例:

struct B
{
  int i, j, k;
};

struct A
{
  A() : b() {} // value-initializes b: b.i, b.j, b.k zero initialized

  B b;
};

struct AA
{
  AA() {} // default-initializes b: b.i, b.j, b.k have no initialization

  B b;
};

关于c++ - 我对这个 C++ 构造函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28127468/

相关文章:

c++ - 覆盖 std::equal

c++ - 如何使用 Qt/C++ 获取 Windows 路径

c++ - c++98 如何通过特定字段在 QList 中查找对象?

c++ - Boost::Thread 函数导致嵌入式 ARM 上的段错误

c++ - 按值返回是否调用复制构造函数或复制赋值运算符?

c++ - 在没有参数列表的情况下无效使用模板名称 'BigNumber'

java 。隐式 super 构造函数 Settore() 未定义。必须显式调用另一个构造函数

javascript - 这两种构造函数模式有什么区别?

Javascript 构造函数创建与先前创建的对象具有相同值的新对象

具有自定义分配器和删除器的 C++ tr1 shared_ptr