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);
}
如果我错了,请纠正我。否则,
假设我写了
using namespace std;
在程序的开头,下面的代码是否等同于之前的代码?
//inside the member function
std::func(x,y);
}
并且,如果我使用除std之外的其他命名空间,答案是否会改变?即 如果我使用,
using namespace abc
是以下声明
abc::func(x,y)
和
::func(x,y)
在任何条件下完全相同或者在特定条件下是否会发生变化?
谢谢。
答案 0 :(得分:2)
在程序的开头,下面的代码是否等同于之前的代码?
//inside the member function std::func(x,y);
不,不是。因为您预先形成限定名称查找。这意味着您准确指定要定义的名称空间func
。 std::func
,如果它存在,仍然属于std
命名空间,而不是全局命名空间。
using namespace
指令仅使标识符可用于非限定名称查找,由编译器决定是否可以找到它。我知道,这一点非常复杂,但这就是命名空间被认为有用的原因。
答案 1 :(得分:1)
当你碰撞名字时,问题就出现了。
不要using namespace std;
,因为它可能导致碰撞问题。
这些代码完全相同:
using namespace std;
sort(params...); // Omitted, this will call std::sort
std::sort(params...);
即使您是using namespace std
,只要std::std
不存在,std :: sort就会调用相同的函数(并且从用户端定义它是非法代码)。
但是,abc::func()
与::func()
完全相同。开头的::
表示根命名空间,它是最外部的命名空间。在这种情况下,没有含糊不清或隐含的填充。
答案 2 :(得分:0)
using namespace
指令允许您的代码使用指定命名空间中的内容。你甚至可以有几个:
using namespace x;
using namespace y;
这意味着像func()
这样的函数调用将调用其代码驻留在x
或y
命名空间中(或者实际上位于全局命名空间中)的函数。 / p>
如果你的代码看起来像这样
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 ...}
};
}
然后,如果您想拨打func
之外的class
,可以使用x::func()
或::x::func()
,但不能使用::func()
。