何时使用 " . " 或 " -> " 运算符访问属性或成员函数?

When to use " . " or " -> " operators to access attribute or member function?

本文关键字:属性 访问 成员 函数 运算符 gt 何时使      更新时间:2023-10-16

在C, c++和Objective-C中,我们都可以使用.->来访问值或函数。两者之间的区别或缺点是什么?

C -Language中可以将a->b视为(*a).b

当使用指向对象的指针调用成员函数时,需要->。当使用对象调用成员函数时,需要.

例如

student Tom; 
student *ptr_Tom = &Tom;  
Tom.func();  
ptr_Tom->func();

在Objective-C中,.->操作符有非常特殊的用途。没有选项

使用.来访问属性或c结构的成员。

可以使用->访问实例变量。它可以用来访问一个公共ivar(尽管你不应该有任何这些),或者如果你引用一个self的ivar,它可以是任何ivar。

它们作用于不同的类型。->的左侧是一个指针(或类指针对象),.的左侧是一个值或引用。

给定:

struct t_thing { int a; };

使用以下语法:

// reference (C++)
void foo(t_thing& pThing) { pThing.a = 1; }
// value
void foo(t_thing pThing) { pThing.a = 1; }
// pointer
void foo(t_thing* const pThing) {
  pThing->a = 1;
  // or
  (*pThing).a = 1;
}

c++的另一个区别是operator->可能是用户定义的,而operator.可能不是。operator->通常用于访问容器的成员,如智能指针。

"缺点"不是一个问题,因为它只是归结为语法正确或不正确。

在Objective-C中,可以使用self->ivarobject->ivar直接访问变量。通常,您不会这样写,而是使用以下方式之一:

// setter via setter method -setIvar:, equivalent to [self setIvar:a];
self.ivar = a;
// setter via getter method -ivar:, equivalent to int a = [self ivar];
int a = self.ivar;

或者在某些情况下,您将使用直接访问self是隐式的(即在实例方法的范围内),特别是部分构造的状态,如初始化器或-dealloc:

- (id)init
{
  self = [super init];
  if (nil == self) return nil;
  ivar = 10; // same as self->ivar = 10;
  return self;
}

最后,'attribute'在这些语言中没有任何意义。最接近匹配:属性被Clang和GCC用于特殊的编译器依赖装饰——例如,你可以使用一个属性来标记一个函数为deprecated。

如果变量是指向结构体的指针,则使用->

如果是结构本身或对结构的c++引用,则使用.

不需要考虑选择或权衡,真的。

struct my_struct {
   int foo;
   float bar;
}
struct my_struct data;
struct my_struct * data_pointer = &data;

data.foo

是一回事
data_pointer->foo

此外,从技术上讲,您可以对指针解引用,然后使用。

(*data_pointer).foo

这也可以,但你几乎不想这样写。

a->b -解引用(" a所指向对象的成员b ") .
a.b -结构引用("对象a的成员b ") .

c++中可以重载->操作,但不能重载.操作

例如:

struct mystruct 
{
    int member; 
} 
struct mystruct struct_inst; 
struct mystruct *struct_pointer;
struct_inst.member= var;
struct_pointer->member=var;

((&struct_inst)->member) = var;
(*struct_pointer).member=var;

.应该在左侧有Object或reference时使用。当操作符左侧有指针时,应该使用->

例如

class Temp{
    public int a;
}  
Temp *t=new Temp();
Temp t1=*t;
t1.a=10;// used . operator because t1 is Object
t->a=10;//-> operator cause t is pointer..

所以t->a等于(*t).a