我知道这是一个非常基本的问题,但经过一些谷歌搜索并点击多个链接后,我仍然找不到答案。
我的问题是在C ++语言函数调用中“。”和“ - >”之间有什么区别?
例如,我有一个包含2种不同数据结构的程序。 信号量aaa; 列出bbb;
要在信号量上使用函数,我必须做aaa.P(); 但是在List上,我必须做List-> append(object);
我不太明白为什么Semaphore使用.P()而List使用 - > append() 当信号量只是一个包含整数和列表的数据结构时。
答案 0 :(得分:4)
a.b
用于访问对象b
的成员a
如果a->b
是指针类型,(*a).b
被定义为与a
等效。
.
无法重载,但->
可以为类(非指针类型)重载。 ->
运算符的返回值是应用->
运算符直到达到指针类型的结果。
请注意,不可能与一系列取消引用 - 跟随成员访问操作(尝试并查看),即使 {{ 1}}(取消引用)运算符是可重载的。这是因为您需要“循环”在编译时评估*
的返回类型的结果,这是不可能手动完成的。它对于创建对象的代理非常有用,该对象的行为类似于指向对象的指针。
答案 1 :(得分:4)
当您使用对象本身访问成员或对对象的引用时,请使用.
运算符。
struct Foo
{
void bar() {}
};
Foo foo;
Foo& fooref = foo;
foo.bar();
fooref.bar();
当您通过指向对象的指针访问成员时,请使用->
运算符。继续上面的例子
Foo *fooptr = &foo;
fooptr->bar();
(*fooptr).bar(); // same as preceding line
答案 2 :(得分:2)
在Foo.Bar()
中,Foo
是具有Bar()
的类的对象。
在Foo->Bar()
中,Foo
是指向具有Bar()
的对象的指针。
问题不在于哪个类使用哪个运算符,而是根据上下文使用哪个运算符。
答案 3 :(得分:1)
.
表示访问对象中的项目(对于数据和函数)。 ->
是相同的,但它使用指针来对象。
例如:
struct abc { int xyz; } a;
struct abc *pointer_to_a = &a;
a.xyz = 271828; // manipulates the object directly.
pointer_to_a->xyz = 314159; // manipulates the object through a pointer.
答案 4 :(得分:0)
除了其他人所说的,foo->bar()
与(*foo).bar()
完全相同。这只是一种速记和方便的符号。这是因为->
的{{1}}运算符超载。
答案 5 :(得分:0)
就原始问题而言,区别的原因是信号量是类类型,List是指针类型。这是关于您的特定程序的事实,而不是关于语言的事实。很可能有一些typedef使你的程序的这个结构特征不是很明显。