C++ 类与命名空间范围

C++ 类与命名空间范围,c++,C++,好的,我在读Bjarne Stroustrup写的《C++之旅》这本书,它的类和命名空间范围定义如下: 类作用域:如果名称是在类中、任何函数或枚举类之外定义的,则称为成员名称(或类成员名称)。它的范围从所附声明的开头一直到该声明的结尾 名称空间范围:如果名称是在任何函数、类或枚举类之外的名称空间中定义的,则称为名称空间成员名称。其范围从声明点扩展到名称空间的末尾 坦率地说,我无法理解其中的区别。如果有人能对初学者用更简单的术语或更详细的说明,我将不胜感激 “名称空间”到底是什么意思? 类作用域是

好的,我在读Bjarne Stroustrup写的《C++之旅》这本书,它的类和命名空间范围定义如下:

类作用域:如果名称是在类中、任何函数或枚举类之外定义的,则称为成员名称(或类成员名称)。它的范围从所附声明的开头一直到该声明的结尾

名称空间范围:如果名称是在任何函数、类或枚举类之外的名称空间中定义的,则称为名称空间成员名称。其范围从声明点扩展到名称空间的末尾

坦率地说,我无法理解其中的区别。如果有人能对初学者用更简单的术语或更详细的说明,我将不胜感激

“名称空间”到底是什么意思? 类作用域是否作为类的成员变量,命名空间作用域是否作为任何类之外的全局变量?我的解释正确吗?

“名称空间”到底是什么意思

假设我写下:

namespace ns1
{
    class foo{}
}
namespace ns2
{
    class foo{}
}
现在,即使两个类的名称相同,编译器也会将它们视为:
ns1::foo
ns2::foo
即,它们是不同的类别

类范围和命名空间范围:

namespace ns1{
    int a; // a has existence from here
    class foo{
        int b; // b has existence from here
    }          // b has existence upto here
}  //a has existence upto here

类是一组相互关联的变量和过程。它们由类绑定在一起。例如:

class Human {
public:
    int age;
    string name;
    void GrowOlder() { age += 1; }
};
该类定义中的所有项都在类作用域中。要使用该类,可以执行以下操作:

Human grendan;
grenden.name = "grenden";
grenden.GrowOlder();
本例中使用了“Human”类的“name”和“growleader”成员

name = "grenden"
如果您当前不在“人类”类范围内,那么这将是一个错误

当许多库或应用程序试图彼此交互时,就会出现问题。每个库或应用程序都可能有自己的字符串库、向量数学库等,因此可能存在重复的类名。命名空间是解决此问题的一种方法。您可以将类放在命名空间中,以便更好地限定它

namespace foo
{
    class Human {
    public:
        int age;
        string name;
        void GrowOlder() { age += 1; }
    };
};
现在,“Human”类位于“foo”命名空间范围内。如果您在命名空间之外工作,“Human”不再意味着什么。现在为了使用“Human”类,代码如下所示:

foo::Human grendan;
grenden.name = "grenden";
grenden.GrowOlder();
注意额外的“foo::”。这告诉编译器在“foo”命名空间范围内查找“Human”类

通常,如果您在某个类的某个过程中,那么您就在该类范围内

如果您在名称空间{}块中,或者在代码文件的更高位置有一个“usingnamespace foo;”语句,那么您就在名称空间范围内

例如:

void test()
{
    std::string example = "testest";
}
或者,使用名称空间:

using namespace std;

void test()
{
    string example = "testest";
}

我能想到的
class/struct
namespace
之间的区别:

  • 定义不能多次使用。可以多次使用
    命名空间
    来扩展其内容

    class A { int a; };
    class A { int b; };   // This is not allowed.
                          // You can extend the class by creating
                          // a sub-class and adding new members to
                          // the derived class but you cannot add
                          // members to a class by defining it again.
    
    
    namespace A { int a; }
    namespace A { int b; }   // Perfectly fine.
                             // b is an additional member of the namespace.
    
  • 可以创建
    的对象。不能创建
    命名空间
    的对象。
    有存储要求,而
    命名空间
    没有存储要求


  • 还有,“名称空间”到底是什么意思?有一个全局名称空间,它的作用域跨越整个文件。好吧,名称空间又是什么?@Grendan非常有趣。除了你刚才说明的以外,它的用途是什么?是吗?就像一个名称空间在同一个源c中有多个同名的类或变量一样ode文件?主要是因为库和应用程序代码之间可能发生冲突,就像我在回答中提到的那样。@Grendan-yes名称空间用于避免命名冲突。假设您编写了一个排序函数。但是如果您使用#include和使用名称空间std;则会发生命名冲突。因为排序是在第一步中定义的标准函数,谢谢详细解释到此为止。所以,当我们说
    使用名称空间std
    时,是否意味着我们指的是名为
    std
    的名称空间?它的意思是:“从现在开始,在当前文件中,如果无法解析某些符号,请查看名称空间'std'我为你的答案添加了一个例子。非常感谢你,乔治。非常感谢。:)