点(.)操作符和->在c++中?

在c++中,点(.)操作符和->有什么区别?

266685 次浏览

.操作符用于直接成员访问。

object.Field

箭头解除了对指针的引用,这样你就可以访问它所指向的对象/内存

pClass->Field

箭头操作符与点操作符类似,只是它先对指针进行解引用。foo.bar()在对象foo上调用方法bar()foo->bar在指针foo指向的对象上调用方法bar

当你有指针时使用->。 当你有结构(类)时使用.

当你想要指向属于结构的属性时,使用.:

structure.attribute

当你想通过指针指向一个有内存引用的属性时,使用->:

pointer->method;

或与:

(*pointer).method
< p >目标。 Dot用于对象;

.箭头作用于指向对象的指针
std::string str("foo");
std::string * pstr = new std::string("foo");


str.size ();
pstr->size ();

点操作符不能重载,箭头操作符可以重载。箭头操作符通常应用于指针(或行为类似指针的对象,如智能指针)。点运算符不能应用于指针。

< p >编辑 当应用于指针时,箭头操作符等价于将点操作符应用于指针,例如ptr->field等价于(*ptr).field

foo->bar()(*foo).bar()相同。

上面的括号是必要的,因为*.操作符的绑定强度。

*foo.bar()不能工作,因为Dot (.)操作符首先被求值(参见运算符优先级)

Dot (.)操作符不能重载,arrow (->)操作符可以重载。

Dot (.)操作符不能应用于指针。

也请参见:在c++中,箭头操作符(->)的同义词是什么?

pSomething->someMember

等于

(*pSomething).someMember

很简单,只要你看到

 x->y

知道它是一样的

 (*x).y

的。(点)运算符通常用于从类的实例(或类的静态字段/方法)中获取字段/调用方法。

p.myField, p.myMethod() -一个类的p个实例

->(箭头)操作符用于从类指向的内容获取字段/调用方法。

p->myField, p->myMethod() - p指向类

注意->操作符不能用于某些事情,例如访问操作符[]。

#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.
}

->只是指针解引用的语法糖,

正如其他人所说:

指针- >方法();

是一种简单的表达方式:

(*指针).method ();

更多指针的乐趣,看看Binky,和他的魔法棒去引用:

http://www.youtube.com/watch?v=UvoHwFvAvQE

作为指针,我们可以用

*pointervariable.foo

但是.操作符的优先级比*操作符高,所以.首先计算。所以我们需要用括号强制执行:

(*pointervariable).foo

但是一直键入()是困难的,所以他们开发了->作为表达相同内容的快捷方式。如果您正在访问对象或对象引用的属性,请使用.。如果您正在通过指针访问对象的属性,请使用->

两者之间最简单的区别是"->"在指针去查看对象字段、函数等之前解引用,而"."不先解引用。当你有一个指向对象的指针时,使用"->",当你处理一个对象的实际实例时,使用"."。

另一种等效的书写方法可能是先在指针上使用取消引用的“*”,然后只使用“.”。我们通过使用“->”跳过中间商。

还有其他不同之处,但其他答案已经广泛地涵盖了这一点。

如果您有Java背景,这可能会让您感到困惑,因为在Java中,所有东西都是指针。这意味着没有理由让符号不首先解除对指针的引用。然而,在c++中,你必须更加小心地记住什么是指针,什么不是指针,用前缀“p_”或简单的“p”来标记它们可能是一个好主意。

->操作符用于处理指针,点用于其他操作符。 如果我们有一个struct类:

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

注意:对于一个类,访问类的成员函数的方式也将是相同的