了解如何正确处理c++类常量
Understanding how to correctly treat c++ class constants
考虑以下内容:
namespace MyNamespace{
class MyClass {
public:
// Public area
private:
// Private area
protected:
// Protected area
}; /* Class */
} /* Namespace */
并且考虑我想定义一个特定于我的类的常量。我通常这样做:
namespace MyNamespace{
// Constants
const int MYINT = 12;
const std::string MYSTR = std::string("Hello");
// Class definition
class MyClass {
public:
// Public area
private:
// Private area
protected:
// Protected area
}; /* Class */
} /* Namespace */
这样,我可以通过这种方式(在我的代码中的某个地方)获得我的变量:
MyNamespace::MYINT;
MyNamespace::MYSTR;
这是一个好的做法吗?考虑到常量可以用几种方式处理(例如,数字常量通常使用enum
处理),定义常量(与类相关,但也可以在其他地方使用)的最佳方法是什么?
谢谢
如果您想要特定于类的常量,并希望它们在其他地方有用,如您所说,可能在类之外,然后将它们定义为static
成员数据在public
部分的类:
//.h file
class MyClass
{
public:
//constants declarations
static const int MYINT;
static const std::string MYSTR;
};
//.cpp file
//constants definitions
const int MyClass::MYINT = 12;
const std::string MyClass::MYSTR = std::string("Hello");
用法(或访问):
std::cout << MyClass::MYINT << std::endl;
std::cout << MyClass::MYSTR << std::endl;
输出:12
Hello
在线演示:http://www.ideone.com/2xJsy
您也可以使用enum
,如果您想定义许多积分常数,并且它们都是相互关联的,例如:
class shirt
{
public:
//constants declarations
enum shirt_size
{
small,
medium,
large,
extra_large
};
};
但是如果积分常数不相关,那么在我看来,将它们定义为enum
是没有多大意义的。
没有"最佳"解决方案,当然这是一个非常主观的术语。
考虑到你提到在其他地方使用的常量,我们可以说它们应该在protected
(如果它们被派生类独占使用)中声明,或者更可能在类的public
部分中声明。
非整数类型的常量应该定义为static const
成员(但是如果有其他静态对象引用这些常量,则必须注意静态初始化的顺序)。
整型常量既可以声明为static const int
,也可以声明为枚举。这里的判别因素是两个或多个常数是否可以逻辑地组合在一起。
例如,这可能是一个好主意:
class MyClass {
public:
enum {
Color_Red,
Color_Green,
Color_Blue,
};
};
而这不是:
class MyClass {
public:
enum {
Color_Red,
Vehicle_Car,
};
};
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- constexpr构造函数需要常量成员函数时出现问题