如何在声明时间初始化成员对象?

时间:2017-09-06 05:34:41

标签: c++ initialization

这是一个班级。

class Checker
{
public:
  Checker();
  ~Checker();

private:
  MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path)

};

在声明另一个类时,是否有任何方法可以初始化类成员对象? MapFileParser类只有一个具有MapFileParser::MapFileParser(const char* path)签名的构造函数。但是当它在班级成员时我无法初始化。所以我总是在MapFileParser类的构造函数中初始化Checker成员。

2 个答案:

答案 0 :(得分:2)

从C ++ 11开始,您可以使用default member initializer,例如

class Checker
{
  ...
  MapFileParser m_MapParser{"something"};
  // or
  MapFileParser m_MapParser = MapFileParser("something");
};

在C ++ 11之前,您必须使用member initializer list

  

成员初始化列表是可以指定这些对象的非默认初始化的地方。

e.g。

class Checker
{
public:
  Checker() : m_MapParser("something") {}
  ...
private:
  MapFileParser m_MapParser;
};

答案 1 :(得分:1)

您可以使用:

  1. 用于初始化成员变量的类内成员初始化语法(仅在C ++ 11或更高版本中可能)。

      "scripts": {
        "ng": "ng",
        "start-prod": "ng serve --environment=prod --deploy / --proxy-config proxy.conf.json",
        "start-uat": "ng serve  --environment=uat --deploy / --proxy-config proxy.conf.json",
        "start-dev": "ng serve  --environment=dev --deploy / --proxy-config proxy.conf.json",
        "build:aot": "ngc -p tsconfig-aot.json && rollup -c rollup-config.js",
        "build-prod": "ng build  --environment=prod --aot false output-hashing none --deploy /",
        "build-uat": "ng build  --environment=uat --aot false output-hashing none --deploy /",
        "build-dev": "ng build  --environment=dev --aot false output-hashing none --deploy /",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
      },
    
  2. 用于初始化成员变量的初始化列表语法。

    MapFileParser m_MapParser = MapFileParser("some sensible file name");
    
  3. 只有拥有多个构造函数时,类内成员初始化语法才有用。如果您有一个构造函数,则可以使用初始化列表语法而不会丢失功能。

    如果您有多个构造函数并且能够使用C ++ 11或更高版本的编译器,则可以使用委派构造函数来减少代码重复。

    在评论中,你说:

      

    我将Checker()的参数void修复为const char *,Checker(const char * Path)将路径传递给MapFileParser。

    在这种情况下,唯一的解决方案是使用成员初始化列表来初始化成员。

    Checker::Checker() : m_MapParser("some sensible file name") { ... }