::(作用域解析运算符)在C++中用于多种用途
:: (scope resolution operator) is used for multiple purposes in C++?
我正在学习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()
。
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 在用于格式4的arm模拟器中实现功能时的一个问题