在 C、C++ 和 Objective-C 中,我们都可以使用.
or->
来访问值或函数。两者之间有什么区别或缺点?
8 回答
您可以将其a->b
视为-Language(*a).b
C
当你使用指向对象的指针来调用成员函数时,你需要->
. 使用对象调用成员函数时,需要.
例如
student Tom;
student *ptr_Tom = &Tom;
Tom.func();
ptr_Tom->func();
在 Objective-C 中,.
and->
运算符有非常特殊的用途。没有选项。
您用于.
访问属性或 C 结构成员。
您可以使用->
来访问实例变量。它可用于访问公共 ivar(尽管您永远不应该拥有任何这些),或者如果您引用 的 ivar self
,它可以是任何 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->ivar
orobject->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 使用属性来进行特殊的编译器相关修饰——例如,您可以使用属性将函数标记为已弃用。
如果变量是指向结构的指针,则使用->
如果它是结构本身或对结构的 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;
.
当我们在左侧有对象或引用时应该使用。
->
当我们在运算符左侧有指针时应该使用。
例如
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