点(。)运算符和 - >之间有什么区别?在C ++中?
答案 0 :(得分:297)
foo->bar()
与(*foo).bar()
相同。
由于*
和.
运算符的绑定强度,上面的括号是必要的。
*foo.bar()
无效,因为首先评估了Dot(.
)运算符(参见operator precedence)
点(.
)运算符无法重载,箭头(->
)运算符可能会重载。
点(.
)运算符不能应用于指针。
答案 1 :(得分:67)
对于指针,我们可以使用
*pointervariable.foo
但.
运算符的优先级高于*
运算符,因此首先计算.
。所以我们需要用括号强制它:
(*pointervariable).foo
但是输入()的所有时间都很难,所以他们开发->
作为说同样事情的捷径。如果要访问对象或对象引用的属性,请使用.
如果要通过指针访问对象的属性,请使用->
答案 2 :(得分:55)
点操作符不能重载,箭头操作符可以重载。箭头操作符通常用于指向指针(或类似指针的对象,如智能指针)。点运算符不能应用于指针。
EDIT 当应用于指针箭头时,运算符相当于将点运算符应用于pointee (ptr->字段相当于(* ptr).field)
答案 3 :(得分:28)
箭头操作符就像点,除了它首先取消引用指针。 foo.bar()
调用对象bar()
上的方法foo
,foo->bar
调用指针bar
指向的对象上的方法foo
。
答案 4 :(得分:14)
.
运算符用于直接成员访问。
object.Field
箭头取消引用指针,以便您可以访问它指向的对象/内存
pClass->Field
答案 5 :(得分:13)
pSomething->someMember
相当于
(*pSomething).someMember
答案 6 :(得分:10)
目标。 dot适用于物体; arrow适用于指向对象的指针。
std::string str("foo");
std::string * pstr = new std::string("foo");
str.size ();
pstr->size ();
答案 7 :(得分:5)
有指针时使用->
。
当你有结构(类)时使用.
。
如果您想要属于结构的点属性,请使用.
:
structure.attribute
如果您想通过指针使用->
来指向内存引用的属性:
pointer->method;
或与:
相同(*pointer).method
答案 8 :(得分:3)
请注意 - >运算符不能用于某些事情,例如,访问operator []。
#include <vector>
int main()
{
std::vector<int> iVec;
iVec.push_back(42);
std::vector<int>* iVecPtr = &iVec;
//int i = iVecPtr->[0]; // Does not compile
int i = (*iVecPtr)[0]; // Compiles.
}
答案 9 :(得分:2)
只要你看到
,这很简单 x->y
知道它与
相同 (*x).y
答案 10 :(得分:2)
- &gt;只是指针取消引用的语法糖,
正如其他人所说:
指针 - &GT;方法();
是一种简单的说法:
(*指针)。方法();
要获得更多指针乐趣,请查看Binky和他的解除引用的魔棒:
答案 11 :(得分:1)
。 (点)运算符通常用于从类的实例(或类的静态字段/方法)获取字段/调用方法。
p.myField,p.myMethod() - 一个类的实例
- &gt; (箭头)运算符用于从类指向的内容中获取字段/调用方法。
p-&gt; myField,p-&gt; myMethod() - p指向一个类
答案 12 :(得分:1)
两者之间最简单的区别是&#34; - &gt;&#34;在指针查看对象字段,函数等之前取消引用指针。而#34;。&#34;不首先解除引用。使用&#34; - &gt;&#34;当你有一个指向对象的指针时,使用&#34;。&#34;当你正在使用对象的实际实例时。
另一种削弱这种情况的方法可能是使用解除引用&#34; *&#34;首先在指针上,然后只使用&#34;。&#34;。我们使用&#34; - &gt;&#34;。
跳过中间人还有其他差异,但其他答案已经广泛涵盖了这一点。
如果你有Java背景,这可能会让你感到困惑,因为在Java中,一切都是指针。这意味着没有理由让符号首先取消引用指针。但是在c ++中,你需要更加小心地记住什么是什么,什么不是指针,并且用前缀&#34; p _&#34;标记它们可能是个好主意。或者只是&#34; p&#34;。
答案 13 :(得分:1)
- &gt;当我们使用指针时使用运算符,否则使用点。 所以,如果我们有一个结构类,如:
struct class{ int num_students; int yr_grad; };
我们有一个类* curr_class(类指针)的实例,然后访问我们会做的学生数
cout << curr_class->num_students << endl;
如果我们有一个简单的类对象,比如class_2016,我们会做
cout << class_2016.num_students << endl;
对于指向类的指针 - &gt;运算符等同于
(*obj).mem_var
注意:对于类,访问类的成员函数的方式也是一样的