C++ 为什么要在类和命名空间中定义常量?

C++ 为什么要在类和命名空间中定义常量?,c++,C++,可能重复: 我正在查看Somebody代码,在这样一个类中定义了几十个常量: // header file class Defines { public: static const int Val1; static const int ValN; static const char* String1; static const char* StringN; ... } // .CPP const char* Defines::String1 = "

可能重复:

我正在查看Somebody代码,在这样一个类中定义了几十个常量:

// header file

class Defines
{
public:
    static const int Val1;
    static const int ValN;
    static const char* String1;
    static const char* StringN;
...
}

// .CPP
const char* Defines::String1 = "some value"
etc.
是否有理由这样做,而不是使用名称空间? 其中一个比另一个有优点/缺点吗

---------编辑----------

很抱歉,我显然应该明确指出这一点,因为没有人从类的名称(即“Defines”)推断出它。i、 这些常量与特定的类没有关联,有一个类是专门创建来保存常量的,没有其他内容,这就是类定义包含的所有内容

我的问题不是为什么要将常量放在一个特定的类中,问题是将几十个常量收集在一起,然后将它们放在一个仅用于收集常量的类中,而不是将它们收集在一个名称空间中,是否有任何价值,或者只是为了这个目的将它们收集在一个头文件中,等等

(项目中目前没有名称空间,因此答案中提到的污染名称空间的潜在问题与本例无关。)

-----第32次编辑-----------

还有一个后续问题--- 正在放置 const char*定义::StringN=“Somevalue”


在.h文件中与将其放在.cpp文件中相比效率低下?

,因为这些常量可能与该类紧密耦合。IE类的成员可能将这些常量作为参数或返回它们。可能它们唯一有意义的地方就是这个类的接口,所以将它们放在一个单独的名称空间中是没有意义的,因为它们只对那个类重要。

原因如下:

  • 您的命名空间中没有潜在的随机常量
  • 通过将类和常量包含在其关联的类中,您为类和常量本身添加了意义
  • 如果我要定义一个名为
    NAME
    的全局/命名空间常量,那么它与什么关联?如果我将其添加到类本身中,那么您必须使用类名引用is,这会增加用法的含义,并使代码更具可读性,更不容易出错


    当然,这是可以滥用的。你可以把常数放错地方。您可以在特定类中不正确地放置真正的全局常量。在这两种情况下,你都可以给他们起不好的名字。

    对于大多数事情,给他们尽可能小的范围是有意义的。在这种情况下,与其说是可见性问题,不如说是清晰度问题


    如果在方法中看到
    String1
    ,则不知道它来自何处。如果看到
    Defines::String1
    ,您可以说“好的,这是类
    Defines
    中的一个变量,让我去看看它是什么以及它应该是什么”。查看一个类要比查看整个名称空间好得多,整个名称空间甚至可能分布在多个源文件中。显然,如果变量在一个类中,因为它主要在那个类中使用,那么毫无疑问,它应该在那个类中D

    一般来说,没有理由这样使用类型。我看到过这样的争论:如果“常量集合”演变成一个具体的对象,那么从这种方式开始,转换就更容易了。实际上,我从未见过这种情况发生。它只是隐藏了意图,并且可能会使用私有构造函数来搅乱代码

    有人可能会说类可以与模板一起工作,而名称空间不能。因此,只有当
    定义
    是一个类时,以下类似内容才会起作用:

    template<typename T> int function() {
        return T::x + T::y;
    }
    //later
    cout << function<Defines>() << function<OtherDefines>() << endl;
    
    模板int函数(){
    返回T::x+T::y;
    }
    //后来
    
    cout没有理由像这里这样做;就像没有理由使用
    类定义{public:…}而不是
    struct定义{…}。也许编写代码的人以前使用的语言不支持名称空间/名称空间中的全局变量,或者认为这看起来比许多外部语句和名称空间更“整洁”

    但是,如果您打算将这些常量中的一些设置为私有,然后只允许访问少数函数/类,那么这有一些实际用途。然而,从外观上看,情况并非如此,将其更改为名称空间是有意义的——这样,可以使用
    using Defines::constant和类似

    对第一次编辑的响应:全局名称空间也是一个名称空间,它比其他名称空间更危险,因为东西更可能泄漏到其中。从这个意义上讲,最好将变量放在类中,但仍然不如将它们放在它们自己的名称空间中


    对第二次编辑的响应:
    const char*Defines::StringN=“Somevalue”将导致常量被多次定义,并且程序将无法链接。但是,如果您预先添加了一个
    extern
    ,并将定义放在一个.cpp文件中,那么一切都会很好,并且不会有性能损失。

    但是,1)没有以前存在的混乱名称空间。2) 正如类“Defines”的名称所示,它们位于一个单独的类中,即不与它们相关的特定类相关联。它仍然增加了意义,因为您知道它来自何处(因此,如果您也需要,可以在何处查找它)它集中了分布,而不是使一堆名称空间全局变量存在于随机文件中。它集中了位置,类似于将本地化详细信息存储到单个资源文件中(至少对于给定的单元)。抱歉,我看不出在类中收集常量与在命名空间中收集常量之间的区别。命名空间同样集中了它们的分布