在C+中,何时使用点、箭头或双冒号来表示类的成员+;? 从其他C派生语言(如java或C++)到C++,首先混淆C ++有三种方法来引用类成员: A::B< /COD>, A.B.,和 A- > B。何时使用这些运算符中的哪一个 (注:这意味着是[堆栈溢出的C++ FAQ ]的条目(https://stackoverflow.com/questions/tagged/c++-faq)。如果你想对以这种形式提供faq的想法提出批评,那么[开始这一切的meta上的帖子](https://meta.stackexchange.com/questions/68647/setting-up-a-faq-for-the-c-tag)这个问题的答案在[C++聊天室]中监控(https://chat.stackoverflow.com/rooms/10/c-lounge),这是常见问题解答的最初想法,因此您的答案很可能会被提出此想法的人阅读。)_ 三个不同的操作符C++用于访问类或类对象的成员,即双冒号::,DOT > /COD>,箭头 ->代码>,用于三个不同的场景,它们总是定义良好的。了解了这一点,您就可以立即了解大量有关a和b的信息,只需分别查看查看的任何代码中的a::b、a.b或a->b
在C+中,何时使用点、箭头或双冒号来表示类的成员+;? 从其他C派生语言(如java或C++)到C++,首先混淆C ++有三种方法来引用类成员: A::B< /COD>, A.B.,和 A- > B。何时使用这些运算符中的哪一个 (注:这意味着是[堆栈溢出的C++ FAQ ]的条目(https://stackoverflow.com/questions/tagged/c++-faq)。如果你想对以这种形式提供faq的想法提出批评,那么[开始这一切的meta上的帖子](https://meta.stackexchange.com/questions/68647/setting-up-a-faq-for-the-c-tag)这个问题的答案在[C++聊天室]中监控(https://chat.stackoverflow.com/rooms/10/c-lounge),这是常见问题解答的最初想法,因此您的答案很可能会被提出此想法的人阅读。)_ 三个不同的操作符C++用于访问类或类对象的成员,即双冒号::,DOT > /COD>,箭头 ->代码>,用于三个不同的场景,它们总是定义良好的。了解了这一点,您就可以立即了解大量有关a和b的信息,只需分别查看查看的任何代码中的a::b、a.b或a->b,c++,c++-faq,C++,C++ Faq,a::b仅在b是类(或命名空间)a的成员时使用。也就是说,在本例中,a将始终是类(或命名空间)的名称 a.b仅在b是对象的成员(或对象的引用)a时使用。因此,对于a.b,a始终是类的实际对象(或对对象的引用) a->b最初是(*a).b的简写符号。但是,->是唯一可以重载的成员访问操作符,因此如果a是重载操作符->的类的对象(常见的此类类型是智能指针和迭代器),则其含义与类设计器实现的内容无关。总结:使用a->b,如果a是指针,b将是指针a所指对象的成员。但是,如果a是重载此运算符的类的对象,则
a::b
仅在b
是类(或命名空间)a
的成员时使用。也就是说,在本例中,a
将始终是类(或命名空间)的名称
a.b
仅在b
是对象的成员(或对象的引用)a
时使用。因此,对于a.b
,a
始终是类的实际对象(或对对象的引用)a->b
最初是(*a).b
的简写符号。但是,->
是唯一可以重载的成员访问操作符,因此如果a
是重载操作符->
的类的对象(常见的此类类型是智能指针和迭代器),则其含义与类设计器实现的内容无关。总结:使用a->b
,如果a
是指针,b
将是指针a
所指对象的成员。但是,如果a
是重载此运算符的类的对象,则会调用重载运算符函数operator->()
小字体:
- 在C++中,声明为“代码>类< /代码>、<代码>结构> <代码>或<代码>联合< /COD>类型被认为是“类类型”。所以上面提到的是这三个李>
- 从语义上讲,引用是对象的别名,所以我也应该在#3中添加“或对指针的引用”。然而,我认为这会让人困惑而不是帮助,因为很少使用指针(
)的引用T*&
- 点运算符和箭头运算符可用于引用对象中的静态类成员,即使它们不是对象的成员。(感谢奥利指出这一点!)
a->b
仅在a
是指针时使用。它是的缩写(*a).b
,即a
指向的对象的b
成员。C++有两种指针,即“正则”和智能指针。对于常规指针,如A*A
,编译器实现->
。对于智能指针,如std::shared_ptr a
,->
是类shared_ptr
的成员函数
理由:本FAQ的目标受众不是编写智能指针。他们不需要知道->
实际上被称为操作符->()
,或者它是唯一可以重载的成员访问方法
#包括
使用名称空间std;
阶级人{
私人:
智力年龄;
公众:
字符串名;
Human(int-humanAge,字符串humanName)
:年龄(人名),姓名(std::move(人名)){}
无效剂量测定法(){
cout点运算符用于直接成员选择方案。
print(a.b)
print(a->b)
print(a::b)
在这里,我们访问的是b
,它是对象a
的直接成员。因此,首先,a
是对象,b
是a
的成员(函数/变量等)
箭头运算符用于间接成员选择方案。
print(a.b)
print(a->b)
print(a::b)
这里,我们正在访问b
,它是对象的一个成员,由a
指向。它是(*a)的缩写。b
,因此这里,a
主要是指向对象的指针,b
是该对象的一个成员
双冒号(作用域)运算符用于与命名空间相关的直接成员选择方案。
print(a.b)
print(a->b)
print(a::b)
这里,我们正在访问
b
,它是类/名称空间a
的成员。因此,a
主要是类/名称空间,b
是成员(函数/变量等)对于a
可能需要澄清的是,
和->
也可以通过对象访问类静态,即使它们不是严格意义上的“对象成员”@Oli:的确如此。我已经把它添加到小字本中了,因为我认为它不常见,也不重要,不能在正文中列出。为了完整起见,可能需要指出的是,operator*()
也可以重载,并且没有任何东西强迫重载与operator->()
一致!(我没有投票否决BTW,只是通过一个长的重复序列来这里)@ OliCharlesworth,您知道C++标准中指定的位置吗?@ JuangopaZa:您不能通过OrdLoad获得<代码> > >代码>的链接行为。