繁体   English   中英

::(作用域分辨率运算符)在C ++中有多种用途?

[英]:: (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM