调用函数C ++的不同方法

时间:2011-10-25 01:48:32

标签: c++ function

我知道这是一个非常基本的问题,但经过一些谷歌搜索并点击多个链接后,我仍然找不到答案。

我的问题是在C ++语言函数调用中“。”和“ - >”之间有什么区别?

例如,我有一个包含2种不同数据结构的程序。 信号量aaa; 列出bbb;

要在信号量上使用函数,我必须做aaa.P(); 但是在List上,我必须做List-> append(object);

我不太明白为什么Semaphore使用.P()而List使用 - > append() 当信号量只是一个包含整数和列表的数据结构时。

6 个答案:

答案 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使你的程序的这个结构特征不是很明显。