调用函数的不同方法

Different ways of calling functions C++

本文关键字:方法 函数 调用      更新时间:2023-10-16

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

我的问题是"。和"->"在函数调用在c++语言?

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

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

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

在使用对象本身或对象的引用访问成员时使用.操作符

struct Foo
{
  void bar() {}
};
Foo foo;
Foo& fooref = foo;
foo.bar();
fooref.bar();

当通过指向对象的指针访问成员时,使用->操作符。继续上面的例子

Foo *fooptr = &foo;
fooptr->bar();
(*fooptr).bar();  // same as preceding line

表面:

a.b用于访问对象a的成员b
如果a是指针类型,则a->b被定义为与(*a).b等价。

更多信息:

.不能重载,但->可以重载类(非指针类型)。->操作符的返回值是应用->操作符直到达到指针类型的结果。

注意,这是不可能的与解引用后的成员访问操作序列(试试看),即使 *(解引用)操作符是可重载的。这是因为你需要"循环"在编译时计算->返回类型的结果,这是不可能手动完成的。这对于创建一个对象的代理很有用,它的行为就像指向对象的指针。

Foo.Bar()中,Foo是具有Bar()的类的对象。

Foo->Bar()中,Foo是一个指针,指向具有Bar()的对象。

问题不在于哪个类使用哪个操作符,而在于根据上下文使用哪个操作符。

.表示访问对象中的项(对于data 函数)。->是相同的,但它使用指针指向对象。

例如:

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.

除了别人说的,foo->bar()(*foo).bar()是完全一样的。这只是一个简写和方便的符号。除非->操作符为foo重载。

就您最初的问题而言,造成差异的原因是Semaphore是类类型,而List是指针类型。这是关于你的特定程序的事实,而不是关于语言的事实。最有可能的是,有一些类型使得程序的这种结构特性不是很明显。