了解如何正确处理c++类常量

Understanding how to correctly treat c++ class constants

本文关键字:常量 c++ 正确处理 了解      更新时间:2023-10-16

考虑以下内容:

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,
        };
};