C、C++、Objective-C の両方で、 or を使用.
し->
て値または関数にアクセスできます。両者の違いや欠点は何ですか?
8 に答える
-Languageのa->b
よう(*a).b
に扱うことができますC
オブジェクトへのポインターを使用してメンバー関数を呼び出す場合は、->
. オブジェクトを使用してメンバー関数を呼び出す場合は、.
例えば
student Tom;
student *ptr_Tom = &Tom;
Tom.func();
ptr_Tom->func();
Objective-C では、.
and->
演算子には非常に特殊な用途があります。オプションはありません。
.
プロパティまたは C 構造体メンバーにアクセスするために使用します。
を使用->
してインスタンス変数にアクセスできます。パブリック ivar にアクセスするために使用できます (ただし、これらのいずれも持つべきではありません) self
。
それらはさまざまなタイプで動作します。の左側->
はポインター (またはポインターのようなオブジェクト) であり、 の左側.
は値または参照です。
変数が構造体へのポインターである場合は、->
構造体自体または構造体への 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
これも機能しますが、そのように書きたいと思うことはほとんどありません。
与えられた:
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++ のもう 1 つの違いは、operator->
ユーザー定義の場合とそうでoperator.
ない場合があることです。operator->
多くの場合、スマート ポインターなどのコンテナーのメンバーにアクセスするために使用されます。
「欠点」は、構文的に正しいか正しくないかのいずれかになるため、問題ではありません。
Objective-C では、ivar への直接アクセスにorを使用できます。通常、これを記述せず、次のいずれかを使用します。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;
}
最後に、「属性」はこれらの言語では意味がありません。最も近い一致: 属性は、特別なコンパイラ依存の装飾のために Clang および GCC によって使用されます。たとえば、属性を使用して、関数を非推奨としてマークすることができます。
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