好的,所以我正在阅读Bjarne Stroustrup撰写的名为“A Tour of C ++”的书,它的类和命名空间范围定义如下:
类范围:如果名称在类中定义,在任何函数或枚举类之外,则名称称为成员名称(或类成员名称)。其范围从其附件声明的开头延伸到该声明的结尾。
命名空间范围:如果名称在任何函数,类或枚举类之外的命名空间中定义,则该名称称为命名空间成员名称。它的范围从声明点延伸到命名空间的末尾。
坦率地说,我无法理解这种差异。如果有人能够以简单的术语或初学者的更多细节来解释这一点,那将非常感激。
'命名空间'到底意味着什么? 类范围是类的成员变量,而命名空间范围是任何类之外的全局变量吗?我的解释是否正确?
答案 0 :(得分:1)
'命名空间'到底意味着什么?
说我写这个:
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
答案 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/struct
和namespace
之间的差异:
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.
您可以创建class
的对象。您无法创建namespace
的对象。 class
有存储要求,namespace
没有。