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

And*_*dry 12 c++

考虑以下:

namespace MyNamespace{
class MyClass {
public:
   // Public area
private:
   // Private area
protected:
   // Protected area
}; /* Class */
} /* Namespace */
Run Code Online (Sandbox Code Playgroud)

并且考虑我想定义一个特定于我的类的常量.我通常会做以下事情:

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 */
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以通过这种方式获取变量(在我的代码中的某个地方):

MyNamespace::MYINT;
MyNamespace::MYSTR;
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯吗?考虑到常量可以用多种方式处理(例如数字常量通常用于处理enum),定义常量的最佳方法是什么(与类相关,但在其他地方也有用)?

谢谢

Naw*_*waz 24

如果你想要特定于类的常量,并希望它们在你说的其他地方有用,可能在类之外,那么在类staticpublic部分中将它们定义为成员数据:

//.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");
Run Code Online (Sandbox Code Playgroud)

用法(或访问):

std::cout << MyClass::MYINT << std::endl;
std::cout << MyClass::MYSTR << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

12
Hello
Run Code Online (Sandbox Code Playgroud)

在线演示:http://www.ideone.com/2xJsy


enum如果要定义许多积分常量,并且所有这些常量都以某种方式相关,也可以使用,例如:

class shirt
{
 public:
   //constants declarations
   enum shirt_size
   {
        small, 
        medium,
        large,
        extra_large
   };
};
Run Code Online (Sandbox Code Playgroud)

但是如果积分常数不相关,那么enum在我看来将它们定义为没有多大意义.

  • @Andry:*我可以只在标题中声明和定义它们吗?*简答题是否定的,但是答案更长......如果常量是整数类型,你可以通过*声明*并赋值来逃避在标题中.细节是你只能在不使用积分常数*时才能这样做,其中*used*基本上意味着*用作左值*.即你可以使用它作为编译时常量或在任何rvalue足够的情况下:`int x = 1 + type :: constant;`,但不是需要左值的地方:`int const&k = type :: constant ;`. (3认同)

Jon*_*Jon 5

不存在“最佳”解决方案,因为这当然是一个非常主观的术语。

考虑到您提到在其他地方使用的常量,我们可以说它们应该在类的部分中声明protected(如果它们仅由派生类使用)或更可能在public类的部分中声明。

非整数类型的常量应定义为成员(但如果有任何其他静态对象引用这些常量,则static const必须注意静态初始化的顺序)。

正如您已经提到的,整数类型的常量可以声明为static const int或枚举。这里的区别因素是两个或多个常数是否可以逻辑上分组在一起。

例如,这可能是一个好主意:

class MyClass {
    public:
        enum {
            Color_Red,
            Color_Green,
            Color_Blue,
        };
};
Run Code Online (Sandbox Code Playgroud)

虽然这不是:

class MyClass {
    public:
        enum {
            Color_Red,
            Vehicle_Car,
        };
};
Run Code Online (Sandbox Code Playgroud)