[英]:: (scope resolution operator) is used for multiple purposes in C++?
我正在学习C ++,并且想确认一些知识。 我已经看到std::cin
具有::运算符,这意味着iostream.h文件必须在命名空间std中具有与cin相关的代码。 而如果您包含myclass.h
并且在这样的命名空间中没有类,
//myclass.h
class x { void func(){}};
然后,您无需执行此myclass:x.func();
相反,我只能执行x.func();
。 正确因为它不在名称空间内。
其次, ::
可以用于在类外部定义类函数,例如在其cpp文件中。 正确?
现在,我的另一个问题是这两个功能是分开的还是一个? 他们对我来说看起来有所不同吗?
::(作用域分辨率运算符)在C ++中有多种用途?
这实际上只是一个目的-帮助查找标识符所在的名称空间和/或类/结构/联合作用域。
编译器知道首先要在最紧密的范围内查看,然后再回到全局范围,但是它还会考虑您正在“使用”的任何名称空间和标识符(例如, using namespace xxx;
或using ns1::identifier;
)。
然后,您无需执行此myclass:x.func();。 相反,我只能执行x.func();
它与磁盘上的文件无关。
其次,::可以用于在类外部定义类函数,例如在其cpp文件中。 正确?
是。 当您在类的外部定义成员函数时,请使用类名,因此在当前范围内,它不被视为不同的非成员函数。
现在,我的另一个问题是这两个功能是分开的还是一个? 他们对我来说看起来有所不同吗?
只是上面的定义成员功能场景中的一个。
我已经看到std :: cin具有::运算符,这意味着
iostream.h
文件必须在命名空间std中包含与cin相关的代码。
我意识到这不是问题,但您说的是iostream.h
,我想指出的是您不应该使用iostream.h
因为它已被弃用,而应使用iostream
。
然后,您无需执行此myclass:x.func();。 相反,我只能做这个x.func();。 正确因为它不在名称空间内。
这是对的。 如果所有代码都在名称空间而不是类中,则可以执行相同的操作。
其次,::可以用于在类外部定义类函数,例如在其cpp文件中。 正确?
只要在类范围内已声明但未定义它们就正确,这是允许的,并且通常出于可读性考虑而更可取。
现在,我的另一个问题是这两个功能是分开的还是一个? 他们对我来说看起来有所不同吗?
如果两者都已经在类范围内,则void x::func(){}
和void func(){}
产生相同的结果xa; a.func()
例如,可以使用xa; a.func()
来调用两者)。
编辑:响应评论,您可以使用与定义类基本相同的方式定义名称空间,如下所示:
namespace funcs
{
void innerfunc(){}
void outerfunc();
void funcs::scopedfunc(){}
}
funcs::outerfunc();
正如您可以从std
推断出的那样,这些被称为自由函数,而不是像非静态类函数那样从对象中调用。
int main()
{
funcs::innerfunc();
using namespace funcs;
outerfunc();
}
然后,您无需执行此myclass:x.func();。 相反,我只能做这个x.func();。
请注意,这些都不会编译。 您不能将点运算符与类一起使用; 您只能将其与对象一起使用。 具体来说, myObject.func();
与MyClass::func() { }
用途完全不同。 第一个调用名为myObject
的对象的成员函数func()
。 后者用于定义函数func()
,该函数属于MyClass
的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.