-1

C、C++、Objective-C の両方で、 or を使用.->て値または関数にアクセスできます。両者の違いや欠点は何ですか?

4

8 に答える 8

6

-Languageのa->bよう(*a).bに扱うことができますC

于 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 にアクセスするために使用できます (ただし、これらのいずれも持つべきではありません) self

于 2013-05-19T05:26:36.973 に答える
3

それらはさまざまなタイプで動作します。の左側->はポインター (またはポインターのようなオブジェクト) であり、 の左側.は値または参照です。

于 2013-05-19T05:21:54.423 に答える
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 に答える
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++ のもう 1 つの違いは、operator->ユーザー定義の場合とそうでoperator.ない場合があることです。operator->多くの場合、スマート ポインターなどのコンテナーのメンバーにアクセスするために使用されます。

「欠点」は、構文的に正しいか正しくないかのいずれかになるため、問題ではありません。

Objective-C では、ivar への直接アクセスにorを使用できます。通常、これを記述せず、次のいずれかを使用します。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;
}

最後に、「属性」はこれらの言語では意味がありません。最も近い一致: 属性は、特別なコンパイラ依存の装飾のために Clang および GCC によって使用されます。たとえば、属性を使用して、関数を非推奨としてマークすることができます。

于 2013-05-19T05:33:57.470 に答える
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 に答える