C++ 使用名称空间比使用类有优势吗?

C++ 使用名称空间比使用类有优势吗?,c++,class,scope,namespaces,C++,Class,Scope,Namespaces,类似乎为变量和函数提供了一个作用域,本质上允许它完成名称空间所做的一切 我错了吗 如果没有,为什么要在类上使用名称空间?您不能在类范围内专门化多个模板中的一个模板 class C { template<typename> struct S; template<> struct S<int> {}; // error }; C类 { 模板结构; 模板结构S{};//错误 }; 更重要的是,语言功能的使用表明了意义,使用熟悉和易于理解的东西本

类似乎为变量和函数提供了一个作用域,本质上允许它完成名称空间所做的一切

我错了吗


如果没有,为什么要在类上使用名称空间?

您不能在类范围内专门化多个模板中的一个模板

class C
{
    template<typename> struct S;
    template<> struct S<int> {};  // error
};
C类
{
模板结构;
模板结构S{};//错误
};

更重要的是,语言功能的使用表明了意义,使用熟悉和易于理解的东西本身就有价值。

在许多模板中,不能将模板专门化为一个模板

class C
{
    template<typename> struct S;
    template<> struct S<int> {};  // error
};
C类
{
模板结构;
模板结构S{};//错误
};

更重要的是,语言功能的使用表明了意义,使用熟悉和容易理解的东西本身就有价值。

这是两个不同的目的

名称空间用于避免命名冲突,向外界隐藏一些名称,并最终帮助组装组件(当名称空间及其别名用于处理不同的库时,例如boost::regex与std::regex)


一个类将被实例化并创建对象。命名空间中的变量只存在一次。类中的非静态数据成员对于每个实例化对象存在一次。所以它不仅仅是封装和访问控制。

它有两个不同的用途

名称空间用于避免命名冲突,向外界隐藏一些名称,并最终帮助组装组件(当名称空间及其别名用于处理不同的库时,例如boost::regex与std::regex)


一个类将被实例化并创建对象。命名空间中的变量只存在一次。类中的非静态数据成员对于每个实例化对象存在一次。因此,它不仅仅是封装和访问控制。

如果您有一个只包含静态成员函数的类,那么它们看起来非常类似于名称空间

class A {
    static void foo();
}
可以使用
A::foo()

如果使用名称空间

namespace B {
    void bar();
}
这也将用作
B::bar()

类和名称空间都是唯一定义函数名的(请参阅)

现在,相似性已经完成。类是面向对象编程的基本组织单元。它们封装了对这些数据进行操作的数据和逻辑,并隐藏了对类用户来说并不重要的所有内容(例如数据和私有方法)


类的一个非常重要的属性是,您可以从中创建对象。通常,从一个类创建多个对象。这不能用名称空间来完成。

如果您有一个只包含静态成员函数的类,那么它们看起来与名称空间非常相似

class A {
    static void foo();
}
可以使用
A::foo()

如果使用名称空间

namespace B {
    void bar();
}
这也将用作
B::bar()

类和名称空间都是唯一定义函数名的(请参阅)

现在,相似性已经完成。类是面向对象编程的基本组织单元。它们封装了对这些数据进行操作的数据和逻辑,并隐藏了对类用户来说并不重要的所有内容(例如数据和私有方法)


类的一个非常重要的属性是,您可以从中创建对象。通常,从一个类创建多个对象。这不能用名称空间来完成。

这是一个有趣的问题。例如,ADL与structs一起工作:为什么在螺丝刀上使用钻头?(提示,它们不是。不同的工具有不同的用途)。名称空间可以拆分。课程不能。这是一个有趣的问题。例如,ADL与structs一起工作:为什么在螺丝刀上使用钻头?(提示,它们不是。不同的工具有不同的用途)。名称空间可以拆分。类不能。按照这些原则,您不能像使用一样为扩展重新打开类namespaces@Justin是的,还有无数其他的原因让我觉得这是一个太宽泛的问题,沿着这些思路,你不能像你一样重新打开一个扩展类namespaces@Justin对还有无数其他原因让我觉得这个问题太宽泛了