Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

C++の曖昧性と競合

すべてのObjective-Cプログラムがインクルードする必要のあるObjective-Cヘッダファイルには、いくつかの識別子が定義されています。これらの識別子は、idClassSELIMPBOOLです。

Objective-Cメソッドの内部では、コンパイラはC++のキーワードthisと同様に、識別子selfsuperを事前宣言します。しかし、C++のキーワードthisとは異なり、selfsuperはコンテキスト依存であるため、Objective-Cメソッドの外部でも通常の識別子として使用できます。

プロトコル内のメソッドのパラメータリストには、さらに5つのコンテキスト依存キーワードがあります(onewayinoutinoutbycopy)。これらは、他のコンテキストではキーワードになりません。

Objective-Cプログラマの観点から見ると、C++には新しいキーワードが多数追加されています。それでもC++キーワードはObjective-Cセレクタの一部として使用できるため、影響はそれほど大きくありません。しかし、Objective-Cクラスやインスタンス変数の指定にC++キーワードを使用することはできません。たとえば、classがC++キーワードであったとしても、依然としてNSObjectメソッドclassを使用できます。

[foo class]; // OK

ただし、これはキーワードであるため、classを変数名として使用することはできません。

NSObject *class; // エラー

Objective-Cでは、クラスとカテゴリの名前は別々のネームスペースに属します。つまり、@interface foo@interface(foo)は、同じソースコード内に存在できます。Objective-C++では、C++クラスや構造体の名前と同じカテゴリを持つこともできます。

プロトコルとテンプレートの指定子は、異なる用途に同じ構文を使用します。

id<someProtocolName> foo;
TemplateType<SomeTypeName> bar;

このような曖昧さを避けるために、コンパイラではidをテンプレート名として使用することを認めていません。

最後に、次のように、ラベルの後にグローバル名を使用した式を続けた場合に、C++の構文解釈上の曖昧さが生じます。

label: ::global_name = 3;

最初のコロンの後のスペースは必須です。Objective-C++にも同様の場合があり、やはりスペースが必須です。

receiver selector: ::global_c++_name;


< 前ページ次ページ >


Last updated: 2007-10-31




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice