关于::(scope_resolution_operator)的使用的疑问

时间:2017-03-28 09:43:44

标签: c++

当我学习一本关于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);
}
如果我错了,请纠正我。否则, 假设我写了

using namespace std;

在程序的开头,下面的代码是否等同于之前的代码?

//inside the member function
std::func(x,y);
}

并且,如果我使用除std之外的其他命名空间,答案是否会改变?即 如果我使用,

using namespace abc

是以下声明

abc::func(x,y)

::func(x,y)

在任何条件下完全相同或者在特定条件下是否会发生变化?

谢谢。

3 个答案:

答案 0 :(得分:2)

  

在程序的开头,下面的代码是否等同于之前的代码?

//inside the member function
  std::func(x,y);

不,不是。因为您预先形成限定名称查找。这意味着您准确指定要定义的名称空间funcstd::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()这样的函数调用将调用其代码驻留在xy命名空间中(或者实际上位于全局命名空间中)的函数。 / p>

如果你的代码看起来像这样

using namespace x;
using namespace y;
void func(int, int) {... code ...}

然后func函数进入全局命名空间,而不是xy命名空间。也就是说,::func是指此功能,而x::funcy::func则不是。

要将代码(类,函数等)放在命名空间中,请使用以下代码:

namespace x
{
    void func(int, int) {... code ...}
    class student
    {
        void func(int, int) {... code ...}
    };
}

然后,如果您想拨打func之外的class,可以使用x::func()::x::func(),但不能使用::func()