当我研究一本关于C++的书时,我偶然发现了这一点。如果我们声明一个类,
class student {public:
void func(int v1,int v2)
{
//some code
}
//some members.
};并使用类外具有相同名称的函数(非成员函数),如
void func(int x,inty)如果我想在上面声明的类的成员函数中调用这个非成员函数,语法将是,
//inside the member function...
::func(x,y);
}如果我是wrong.otherwise,请纠正我,假设我写了
using namespace std;在程序开始时,下面的代码是否等同于前面的代码?
//inside the member function
std::func(x,y);
}而且,如果我使用不同于std的命名空间,答案是否会改变??也就是说,如果我使用,
using namespace abc是以下声明
abc::func(x,y)和,
::func(x,y)它们在任何条件下都是绝对等价的,还是在特定条件下会发生变化?
谢谢。
发布于 2017-03-28 17:51:45
在程序开始时,下面的代码是否等同于前面的代码?
//在成员函数std::func(x,y)内;
不,它不是。因为您执行了一个限定的名称查找。这意味着您可以精确地指定要在哪个名称空间中定义func。如果存在std::func,它仍然属于std名称空间,而不是全局名称空间。
using namespace指令仅使标识符可用于非限定名称查找,这由编译器来确定。我知道这一点相当复杂,但这也是名称空间被认为有用的原因。
发布于 2017-03-28 17:48:53
当名称冲突时,问题就出现了。
请勿执行using namespace std;,因为它可能会导致冲突问题。
这些代码是相同的:
using namespace std;
sort(params...); // Omitted, this will call std::sortstd::sort(params...);而且,即使您是using namespace std,只要std::std不存在,std::sort就会调用相同的函数(并且从用户端定义它是非法代码)。
然而,abc::func()不是,与::func()完全相同。开头的::指的是根命名空间,它是最外部的命名空间。在这种情况下,没有歧义或隐式填充。
发布于 2017-03-28 19:09:48
using namespace指令允许您的代码使用指定名称空间中的内容。您甚至可以拥有其中的几个:
using namespace x;
using namespace y;这意味着像func()这样的函数调用将调用其代码驻留在x或y名称空间(或者实际上是全局名称空间)中的函数。
如果您的代码如下所示
using namespace x;
using namespace y;
void func(int, int) {... code ...}则func函数位于全局名称空间中,而不是x或y名称空间中。也就是说,::func引用此函数,而x::func和y::func不引用。
要将您的代码(类、函数等)放入名称空间,请使用以下代码:
namespace x
{
void func(int, int) {... code ...}
class student
{
void func(int, int) {... code ...}
};
}然后,如果要调用class之外的func,可以使用x::func()或::x::func(),但不能使用::func()。
https://stackoverflow.com/questions/43066102
复制相似问题