何时使用 " . " 或 " -> " 运算符访问属性或成员函数?
When to use " . " or " -> " operators to access attribute or member function?
在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->ivar
或object->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
- 通过指向指针数组的指针访问子类的属性
- 使用内存地址访问结构的属性值
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- 如何从传递到对象的对象内部访问对象的类属性?
- 如何使用 pybind 访问结构的属性?
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 如何使用指针从另一个类访问属性
- 让 Redhawk 组件访问另一个组件的属性
- 父级的子属性 - 访问权限
- 访问除main.cpp之外的.cpp文件中的QMLEngine/rootObject属性
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 对象属性同级访问
- BGL:无法访问捆绑的顶点属性
- 如何访问 JSCValue 对象的属性
- 设置使用 Cereal 序列化库时可以在序列化函数中访问的属性
- 在C++中循环数组时访问结构属性
- 如何使用 pugixml 正确访问 xml 属性?
- 基于各个属性/访问器的聚合设计类层次结构
- 如何从 void 指针将属性访问到结构中
- 根据模板参数更改属性访问