初始化类构造函数中的常量
Initializing Constants in Class Constructor
编辑:添加.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)
我们看不到足够的代码来全面审查情况,但这里有一些注意事项:
- 一般来说,这是初始化成员的正确方法
-
对于像这样的简单初始化器,从 C++11 开始,您可以内联提供它们:
struct Foo { ScreenManager* screenMgr; const int myConstant = 42; Foo(ScreenManager* screenMgr); }; Foo::Foo(ScreenManager* screenMgr) : screenMgr(screenMgr) {}
-
但是,由于初始化根本不依赖于任何输入,并且似乎不是特定于实例的,因此尽管您有所保留,但它们可能应该
static const
-
如果它们是
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;
};
相关文章:
- constexpr构造函数需要常量成员函数时出现问题
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么编译器在使用"无常量复制构造函数"时抱怨?
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- C++ 中常量属性的初始化构造函数错误
- 带有常量指针的矢量构造函数示例
- 调用构造函数与将内联常量定义为默认参数
- C++自动生成的具有常量和非常量引用的复制构造函数
- C++ 具有常量数组和initializer_list的重载构造函数
- 为什么在这种情况下调用非常量右值移动构造函数?
- 在可变参数构造函数中初始化常量数组
- 委派复制构造函数和常量数据初始化
- 为什么可以将左值传递到采用常量引用右值的构造函数中?
- CPP/C 中的常量用法和结构构造函数中的澄清
- 初始化类构造函数中的常量
- 将常量字符* 转换为不带构造函数的 std::string
- 带有常量构造函数参数的C++变量构造函数方法