::(作用域解析运算符)在C++中用于多种用途

:: (scope resolution operator) is used for multiple purposes in C++?

本文关键字:用于 C++ 作用域解析 运算符      更新时间:2023-10-16

我正在学习C++,想确认一些thins。我已经看到std::cin具有::运算符,这意味着iostream.h文件必须在命名空间std内具有cin相关代码。然而,如果您包含myclass.h,并且类NOT位于像这样的命名空间中

//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(){}会产生相同的结果(例如,可以使用x a; a.func()调用两者)。

EDIT:作为对注释的响应,您可以定义一个命名空间,基本上与定义类的方式相同,如:

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()。后者用于定义属于MyClass范围的函数func()