点(。)运算符和 – >在C ++中有什么区别?
点(。)运算符和 – >在C ++中有什么区别?
foo->bar()
与(*foo).bar()
。
上面的括号是必需的,因为*
和的绑定强度.
运营商。
*foo.bar()
将不起作用,因为首先计算点( .
)运算符(请参阅运算符优先级 )
点( .
)运算符不能被重载,箭头( ->
)运算符可以被重载。
点( .
)运算符不能应用于指针。
另请参阅: 在C ++中,什么是箭头运算符( – >)的同义词?
点运算符不能重载,箭头运算符可以重载。 箭头运算符通常意味着应用于指针(或者像指针一样行为的对象,比如智能指针)。 点运算符不能应用于指针。
编辑应用于指针箭头运算符相当于应用点运算符指针(ptr->字段相当于(* ptr).field)
对于一个指针,我们可以使用
*pointervariable.foo
但是.
运算符优先于*
运算符,所以.
首先评估。 所以我们需要用括号强制这个:
(*pointervariable).foo
但是,一直打字()是很难的,所以他们发展成一个捷径来说同样的事情。 如果您正在访问对象或对象引用的属性,请使用.
如果通过指针访问对象的属性,请使用->
箭头运算符就像点一样,除了它先取消引用指针。 foo.bar()
调用对象foo
方法bar()
, foo->bar
调用指针foo
指向的对象的方法bar
。
pSomething->someMember
相当于
(*pSomething).someMember
目标。 点在物体上工作; 箭头指向对象的指针。
std::string str("foo"); std::string * pstr = new std::string("foo"); str.size (); pstr->size ();
的.
运营商是直接成员访问。
object.Field
箭头取消引用一个指针,所以你可以访问它指向的对象/内存
pClass->Field
请注意, – >运算符不能用于某些事情,例如访问运算符[]。
#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. }
– >当你有指针时使用。 当你想要属于结构用途的点属性的时候使用结构(class)。 当需要指向具有指针引用的属性时,struct.attribute使用 – >:
pointer->method; or same as: (*pointer).method
这很简单,只要你看到
x->y
知道它是一样的
(*x).y
的。 (点)运算符通常用于从类的实例(或类的静态字段/方法)获取字段/调用方法。
p.myField,p.myMethod() – 一个类的实例
– >(箭头)运算符用于从类指向的内容中获取字段/调用方法。
p-> myField,p-> myMethod() – p指向一个类
– >仅仅是一个指针解引用的语法糖,
正如其他人所说:
指针 – >方法();
是一个简单的说法:
(*指针)。方法();
为了获得更多的指针,请查看Binky和他的解除引用的魔杖:
两者之间最简单的区别在于“ – >”在查看对象字段,函数等之前,先取消引用指针,而“。” 先不解除引用。 当你有一个指向对象的指针时使用“ – >”,并使用“。” 当你正在处理对象的实际实例时。
另一种等同的方法是使用指针上的“*”,然后使用“。”。 我们用“ – >”来跳过中间人。
还有其他的不同,但其他的答案已经广泛地涉及这一点。
如果你有Java的背景,这可能会让你困惑,因为在Java中,一切都是指针。 这意味着没有理由让符号不能先取消指针。 但在c ++中,要记住什么是什么,什么不是指针,要小心一点,用“p_”或“p”作为前缀标记是个好主意。
当我们使用指针的时候使用 – >操作符,否则使用点。 所以,如果我们有一个像这样的结构类:
struct class{ int num_students; int yr_grad; };
我们有一个类* curr_class(类指针)的实例,然后访问我们要做的学生数量
cout << curr_class->num_students << endl;
如果我们有一个简单的类对象,说class_2016,我们会的
cout << class_2016.num_students << endl;
对于类的指针 – >运算符相当于
(*obj).mem_var
注意:对于一个类,访问类的成员函数的方式也是一样的