-1

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

4

8 回答 8

6

您可以将其a->b视为-Language(*a).bC

于 2013-05-19T05:29:24.200 回答
4

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

例如

student Tom; 
student *ptr_Tom = &Tom;  
Tom.func();  
ptr_Tom->func();
于 2013-05-19T05:54:18.073 回答
3

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

您用于.访问属性或 C 结构成员。

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

于 2013-05-19T05:26:36.973 回答
3

它们对不同的类型进行操作。的左侧->是指针(或类似指针的对象),而 的左侧.是值或引用。

于 2013-05-19T05:21:54.423 回答
2

鉴于:

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->ivarorobject->ivar进行直接 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;
}

最后,“属性”对于这些语言来说并不意味着什么。最接近的匹配:Clang 和 GCC 使用属性来进行特殊的编译器相关修饰——例如,您可以使用属性将函数标记为已弃用。

于 2013-05-19T05:33:57.470 回答
2

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

如果它是结构本身或对结构的 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

这也有效,但你几乎不想那样写。

于 2013-05-19T05:22:13.903 回答
1

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;
于 2013-05-19T05:40:56.500 回答
-2

.当我们在左侧有对象或引用时应该使用。 ->当我们在运算符左侧有指针时应该使用。

例如

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

于 2013-05-19T05:22:40.077 回答