是否可以在 C++ 的成员初始化程序列表中初始化数组?

Posted

技术标签:

【中文标题】是否可以在 C++ 的成员初始化程序列表中初始化数组?【英文标题】:Is it possible to initialize an array in a member initializer list in C++? 【发布时间】:2015-11-30 04:15:39 【问题描述】:

所以,我有这个Game 类,我有一个SDL_Rects 数组。如果可能的话,我想在成员初始化器列表中对其进行初始化,而不是在构造函数主体内初始化数组。

//Game.h
#pragma once

class Game 
public:
  Game(SDL_Window* window, SDL_Renderer* renderer);

private:
  SDL_Rect down[4];
;

// Game.cpp
#include "Game.h"

Game::Game(SDL_Window* window, SDL_Renderer* renderer)
  down[0] = 1,4,31,48;
  down[1] = 35,5,25,47;
  down[2] = 65,4,31,48;
  down[3] = 100,5,26,47;

我想做这样的事情:

// Game.cpp
Game::Game()
: down[0](1,4,31,48;
  // etc, etc...

【问题讨论】:

【参考方案1】:

您可以使用direct-list-initialization (c++11 起) 作为成员变量。 (不是数组的每个元素。)

Game::Game()
: down 1,4,31,48, 35,5,25,47, 65,4,31,48, 100,5,26,47

LIVE

【讨论】:

很抱歉,如果未完成的评论在我设法将其删除之前徘徊太久。就目前而言,这是一个不错的答案。【参考方案2】:

没有问题。

所以这是一个令人费解的问题。

struct Rect  int x, y, width, height; ;

struct Game

    Rect down[4] =
    
        1,4,31,48,
        35,5,25,47,
        65,4,31,48,
        100,5,26,47,
    ;
;

#include <iostream>
using namespace std;
auto main() -> int

    Game g;
    for( Rect const& rect : g.down )
    
        cout << rect.x << ' ';
    
    cout << endl;


为了使用std::array 代替原始数组,这通常是一个好主意™,并让代码使用 g++ 编译,向初始化程序添加一组内部大括号,如下所示:

std::array<Rect, 4> down =

    1,4,31,48,
    35,5,25,47,
    65,4,31,48,
    100,5,26,47
;

将初始化放在构造函数的成员初始化器列表中(如果出于某种原因需要,而不是上面的)可以如下所示:

#include <array>

struct Rect  int x, y, width, height; ;

struct Game

    std::array<Rect, 4> down;

    Game()
        : down
            1,4,31,48,
            35,5,25,47,
            65,4,31,48,
            100,5,26,47
        
    
;

#include <iostream>
using namespace std;
auto main() -> int

    Game g;
    for( Rect const& rect : g.down )
    
        cout << rect.x << ' ';
    
    cout << endl;

【讨论】:

我同意,我试图设置一个构建环境来测试它,因为我认为我一定遗漏了一些东西。

以上是关于是否可以在 C++ 的成员初始化程序列表中初始化数组?的主要内容,如果未能解决你的问题,请参考以下文章

C++中初始化列表的使用(总结)

c++中静态成员变量和静态成员函数(笔试经历)

c++初始化函数列表

有没有办法在类 c++ 中取消初始化变量

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)

C++:初始化成员变量(无参构造|有参构造|初始化列表)