初始化类构造函数中的常量

Initializing Constants in Class Constructor

本文关键字:常量 构造函数 初始化      更新时间:2023-10-16

编辑:添加.h文件。

#pragma once
#include "Screen.h"
#include "../IniParams.h"
class AtcParamsMenu : public Screen
{
public:
AtcParamsMenu(ScreenManager *screenMgr, MenuTypes MenuType, IniParams *Params);
~AtcParamsMenu();
private:
enum eFields
{
    make,
    model,
    connector
};
void processKey();
void updateScreen(bool refreshAll);
void selectMaker();
void deSelectMaker();
void setMaker(AtcManufacturer maker);
void setModel();
void setCabinetType();
unsigned char idx;
unsigned char fieldIdx;
const unsigned char addY;// = 1
const unsigned char xIdx;// = 14
const unsigned char dispXidx; // = 15
const unsigned char fieldLen; // = 9
static const eFields minField = make;
static const eFields maxField = connector;
IniParams *params;
MenuTypes menuType;

};

下面是一个类构造函数。

请注意,最后 4 个变量是 .h 文件中的常量无符号字符。这不是基类,但我不喜欢对这些使用静态。

这是否被认为是初始化常量的"干净"方法? 我的一些课程最终可能会有 7 或 8 个这样的课程。

AtcParamsMenu::AtcParamsMenu(ScreenManager *screenMgr, MenuTypes MenuType, IniParams *Params) : 
Screen(screenMgr), addY(1), xIdx(14), dispXidx(15), fieldLen(9)

我们看不到足够的代码来全面审查情况,但这里有一些注意事项:

  1. 一般来说,这是初始化成员的正确方法
  2. 对于像这样的简单初始化器,从 C++11 开始,您可以内联提供它们:

    struct Foo
    {
       ScreenManager* screenMgr;
       const int myConstant = 42;
       Foo(ScreenManager* screenMgr);
    };
    Foo::Foo(ScreenManager* screenMgr)
       : screenMgr(screenMgr)
    {}
    
  3. 但是,由于初始化根本不依赖于任何输入,并且似乎不是特定于实例的,因此尽管您有所保留,但它们可能应该static const

  4. 如果它们是static const的,则不要在构造函数中初始化它们,而是单独定义它们。喜欢这个:

    struct Foo
    {
       static const int myConstant;
       ScreenManager* screenMgr;           
       Foo(ScreenManager* screenMgr);
    };
    const int Foo::myConstant = 42;
    Foo::Foo(ScreenManager* screenMgr)
       : screenMgr(screenMgr)
    {}
    

在 c++11 中,你可以直接在看起来更干净的类声明中初始化:

class AtcParamsMenu
{
    const int addY = 1;
    const int xIdx = 14;
};