【问题标题】:Class vs Namespace scope类与命名空间范围
【发布时间】:2015-03-16 01:24:16
【问题描述】:

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

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

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

坦率地说,我无法理解其中的区别。如果有人可以为初学者以更简单或更详细的方式解释这一点,我们将不胜感激。

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

【问题讨论】:

  • 另外,“命名空间”到底是什么意思?
  • 有一个全局命名空间,其作用域跨越整个文件。
  • 好的,命名空间到底是什么?

标签: c++


【解决方案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

【讨论】:

  • 非常有趣。除了你刚才说明的,它到底有什么用?是这样吗?就像一个命名空间用于在同一个源代码文件中拥有多个同名的类或变量?
  • 主要是因为库和应用程序代码之间可能发生冲突,就像我在回答中提到的那样。
  • @Grendan yes 命名空间用于避免命名冲突。假设您编写了一个排序函数。但是如果你使用 #include 和 using namespace std;你有一个命名冲突。因为 sort 是 中定义的标准函数
【解决方案2】:

类是一组相互关联的变量和过程。他们被班级联系在一起。示例:

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; }
    };
};

现在“人类”类位于“foo”命名空间范围内。如果您在命名空间之外工作,“人”不再意味着任何东西。现在为了使用“人类”类,代码如下所示:

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";
}

【讨论】:

  • 首先,非常感谢您的详细解释。那么,当我们说using namespace std 时,是否意味着我们指的是这个名为std 的命名空间?
  • 它的意思是:“从现在开始,在当前文件中,如果你不能解析某些符号,请查看命名空间'std'。”我已经为你添加了一个例子来回答。
  • 非常感谢豪尔赫。万分感激。 :)
【解决方案3】:

我能想到的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 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2019-10-03
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多