C++ 类与命名空间范围
好的,我在读Bjarne Stroustrup写的《C++之旅》这本书,它的类和命名空间范围定义如下: 类作用域:如果名称是在类中、任何函数或枚举类之外定义的,则称为成员名称(或类成员名称)。它的范围从所附声明的开头一直到该声明的结尾 名称空间范围:如果名称是在任何函数、类或枚举类之外的名称空间中定义的,则称为名称空间成员名称。其范围从声明点扩展到名称空间的末尾 坦率地说,我无法理解其中的区别。如果有人能对初学者用更简单的术语或更详细的说明,我将不胜感激 “名称空间”到底是什么意思? 类作用域是否作为类的成员变量,命名空间作用域是否作为任何类之外的全局变量?我的解释正确吗? “名称空间”到底是什么意思 假设我写下:C++ 类与命名空间范围,c++,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'我为你的答案添加了一个例子。非常感谢你,乔治。非常感谢。:)