首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怀疑::(scope_resolution_operator)的用法

怀疑::(scope_resolution_operator)的用法
EN

Stack Overflow用户
提问于 2017-03-28 17:43:44
回答 3查看 48关注 0票数 1

当我研究一本关于C++的书时,我偶然发现了这一点。如果我们声明一个类,

代码语言:javascript
复制
class student {public:
void func(int v1,int v2)
{
   //some code
}
//some members.
};

并使用类外具有相同名称的函数(非成员函数),如

代码语言:javascript
复制
void func(int x,inty)

如果我想在上面声明的类的成员函数中调用这个非成员函数,语法将是,

代码语言:javascript
复制
//inside the member function...
::func(x,y);
}

如果我是wrong.otherwise,请纠正我,假设我写了

代码语言:javascript
复制
using namespace std;

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

代码语言:javascript
复制
//inside the member function
std::func(x,y);
}

而且,如果我使用不同于std的命名空间,答案是否会改变??也就是说,如果我使用,

代码语言:javascript
复制
using namespace abc

是以下声明

代码语言:javascript
复制
abc::func(x,y)

和,

代码语言:javascript
复制
::func(x,y)

它们在任何条件下都是绝对等价的,还是在特定条件下会发生变化?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-03-28 17:51:45

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

//在成员函数std::func(x,y)内;

不,它不是。因为您执行了一个限定的名称查找。这意味着您可以精确地指定要在哪个名称空间中定义func。如果存在std::func,它仍然属于std名称空间,而不是全局名称空间。

using namespace指令仅使标识符可用于非限定名称查找,这由编译器来确定。我知道这一点相当复杂,但这也是名称空间被认为有用的原因。

票数 2
EN

Stack Overflow用户

发布于 2017-03-28 17:48:53

当名称冲突时,问题就出现了。

请勿执行using namespace std;,因为它可能会导致冲突问题。

这些代码是相同的:

代码语言:javascript
复制
using namespace std;
sort(params...); // Omitted, this will call std::sort

代码语言:javascript
复制
std::sort(params...);

而且,即使您是using namespace std,只要std::std不存在,std::sort就会调用相同的函数(并且从用户端定义它是非法代码)。

然而,abc::func()不是,与::func()完全相同。开头的::指的是根命名空间,它是最外部的命名空间。在这种情况下,没有歧义或隐式填充。

票数 1
EN

Stack Overflow用户

发布于 2017-03-28 19:09:48

using namespace指令允许您的代码使用指定名称空间中的内容。您甚至可以拥有其中的几个:

代码语言:javascript
复制
using namespace x;
using namespace y;

这意味着像func()这样的函数调用将调用其代码驻留在xy名称空间(或者实际上是全局名称空间)中的函数。

如果您的代码如下所示

代码语言:javascript
复制
using namespace x;
using namespace y;
void func(int, int) {... code ...}

func函数位于全局名称空间中,而不是xy名称空间中。也就是说,::func引用此函数,而x::funcy::func不引用。

要将您的代码(类、函数等)放入名称空间,请使用以下代码:

代码语言:javascript
复制
namespace x
{
    void func(int, int) {... code ...}
    class student
    {
        void func(int, int) {... code ...}
    };
}

然后,如果要调用class之外的func,可以使用x::func()::x::func(),但不能使用::func()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43066102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档