:(范围解析运算符)在C+中用于多种用途+;? 我正在学习C++,想确认一些细节。我已经看到std::cinhas::operator,这意味着iostream.h文件必须在名称空间std中包含cin相关代码。然而,如果您包括myclass.h,并且类不在这样的名称空间中 //myclass.h class x { void func(){}};

:(范围解析运算符)在C+中用于多种用途+;? 我正在学习C++,想确认一些细节。我已经看到std::cinhas::operator,这意味着iostream.h文件必须在名称空间std中包含cin相关代码。然而,如果您包括myclass.h,并且类不在这样的名称空间中 //myclass.h class x { void func(){}};,c++,C++,那么您就不需要这样做myclass:x.func()相反我可以这样做x.func()。正确,因为它不在名称空间内 其次,::可以用于定义类外的类函数,就像在它们的cpp文件中一样。对吗 现在我的另一个问题是,这两个功能是分开的还是一个?我只是觉得它们不一样吗 :(范围解析运算符)用于C++中的多个用途? 它实际上只有一个目的——帮助查找标识符所在的名称空间和/或类/结构/联合作用域 编译器知道先查看最紧的范围,然后再返回全局范围,但它也会考虑您“使用”的任何名称空间和标识符(例如使用名称空间xx

那么您就不需要这样做
myclass:x.func()相反我可以这样做
x.func()。正确,因为它不在名称空间内

其次,
::
可以用于定义类外的类函数,就像在它们的cpp文件中一样。对吗

现在我的另一个问题是,这两个功能是分开的还是一个?我只是觉得它们不一样吗

<>:(范围解析运算符)用于C++中的多个用途?

它实际上只有一个目的——帮助查找标识符所在的名称空间和/或类/结构/联合作用域

编译器知道先查看最紧的范围,然后再返回全局范围,但它也会考虑您“使用”的任何名称空间和标识符(例如
使用名称空间xxx;
使用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()
调用两者)

编辑:作为对注释的响应,您可以定义名称空间,基本上与定义类的方式相同,如下所示:

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

的作用域,因此,正如您所指出的,如果您在类的作用域内,则不必使用后者,但如果您以后在类外定义函数,则必须使用后者。好吧,你不能在实际的类作用域之外声明一个类函数,只能定义一个声明的类函数,但我可能错了。我不是说cin重载了运算符。我要说的是,您需要
std:
部分在
std::cin
中,因为
#include
中的代码必须位于
命名空间std
中,如果它不在命名空间中,那么我们就不需要
std:
部分正确吗?就像我们不需要过度定制的类,其中代码不驻留在名称空间内……是的,到目前为止,我已经了解到,类的函数只能在类内声明,但也可以在类外定义。是的,这是正确的,我意识到这就是你们在二读时的意思。我还仔细检查了一下,您必须在定义类的作用域之前声明一个函数,这样您就不能放置类似于
void x::otherfunc()的内容
在您的cpp文件中,而不在类作用域中声明它。大家非常感谢…这对我来说是很多新信息…所以我会再看几天。您是指我写的吗。。。我写了
class::object.func()
object.func()
@MuhammadUmer是的,我指的是你问题的那部分(为了清楚起见编辑)
x.func()
仅在
x
是对象时才编译,而不是在类时编译。@MuhammadUmer
classNamespace::object.func(){}
是非法的。点运算符仅用于调用函数,不用于定义函数
className::func(){}
用于定义函数。@MuhammadUmer
名称空间abc{class::func(){}
@MuhammadUmer与类定义不同,名称空间可以跨多个翻译单元。“如果所有代码都在名称空间而不是类中,则可以执行相同的操作”…只需“相同的事情”即可清楚说明你的意思是放
myclass::