类与命名空间范围

时间:2015-03-16 01:24:16

标签: c++

好的,所以我正在阅读Bjarne Stroustrup撰写的名为“A Tour of C ++”的书,它的类和命名空间范围定义如下:

  

类范围:如果名称在类中定义,在任何函数或枚举类之外,则名称称为成员名称(或类成员名称)。其范围从其附件声明的开头延伸到该声明的结尾。

     

命名空间范围:如果名称在任何函数,类或枚举类之外的命名空间中定义,则该名称称为命名空间成员名称。它的范围从声明点延伸到命名空间的末尾。

坦率地说,我无法理解这种差异。如果有人能够以简单的术语或初学者的更多细节来解释这一点,那将非常感激。

'命名空间'到底意味着什么? 类范围是类的成员变量,而命名空间范围是任何类之外的全局变量吗?我的解释是否正确?

3 个答案:

答案 0 :(得分:1)

  

'命名空间'到底意味着什么?

说我写这个:

namespace ns1
{
    class foo{}
}
namespace ns2
{
    class foo{}
}

现在,即使两个类的名称相同,编译器也会将它们视为: ns1::foons2::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

答案 1 :(得分:0)

类是一组彼此相关的变量和过程。他们被班级捆绑在一起。例如:

class Human {
public:
    int age;
    string name;
    void GrowOlder() { age += 1; }
};

该类定义中的所有项都在类范围内。为了使用课程,你可以这样做:

Human grendan;
grenden.name = "grenden";
grenden.GrowOlder();

本例中使用“Human”类的“name”和“GrowOlder”成员。如果你只是写

name = "grenden"

如果您目前不在“人类”范围内,那将是一个错误。

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

namespace foo
{
    class Human {
    public:
        int age;
        string name;
        void GrowOlder() { age += 1; }
    };
};

现在,“Human”类位于“foo”命名空间范围内。如果你是在名称空间之外工作,那么“人类”就不再有任何意义了。现在,为了使用“Human”类,代码如下所示:

foo::Human grendan;
grenden.name = "grenden";
grenden.GrowOlder();

注意额外的“foo ::”。这告诉编译器查看“foo”命名空间范围,以便找到“Human”类。

一般情况下,如果你在该类的一个程序中,你就在一个类范围内。

如果您位于命名空间{}块内,或者存在“使用命名空间foo”,则您位于命名空间范围内。在你的代码文件中某处更高的语句。

示例:

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

或者,使用命名空间:

using namespace std;

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

答案 2 :(得分:0)

我能想到的class/structnamespace之间的差异:

  1. class定义不能多次使用。可以多次使用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.
    
  2. 您可以创建class的对象。您无法创建namespace的对象。 class有存储要求,namespace没有。