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

时间:2011-04-11 10:53:03

标签: c++

请考虑以下事项:

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处理),定义常量的最佳方法是什么(与类相关,但在其他地方也可以使用)?

三江源

2 个答案:

答案 0 :(得分:21)

如果你想要特定于该类的常量,并且希望它们在你所说的其他地方有用,可能在课外,那么在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

输出:

enum

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


如果你想定义许多积分常数并且它们都以某种方式相关,你也可以使用class shirt { public: //constants declarations enum shirt_size { small, medium, large, extra_large }; }; ,例如:

enum

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

答案 1 :(得分:3)

当然,没有“最佳”解决方案,这是一个非常主观的术语。

考虑到你提到在其他地方使用的常量,我们可以说它们应该在protected中声明(如果它们只由派生类使用)或更可能是{{1}该课程的一部分。

非整数类型的常量应定义为public成员(但如果有任何其他静态对象,则必须小心order of static initialization 参考这些常数)。

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

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

static const int

虽然不是这样:

class MyClass {
    public:
        enum {
            Color_Red,
            Color_Green,
            Color_Blue,
        };
};