関連:「 'NSString *'型のパラメーターに 'const NSString *'を送信すると、修飾子が破棄されます」という警告
時々、私はそれが便利だと思います。テーブルを渡す必要があり、テーブルの内容が変わらないことを確認したい場合があります。
しかし、ほとんどのObjective-Cプログラムのサンプルでは、私は決して見ませんconst
。私の質問はなぜですか?
関連:「 'NSString *'型のパラメーターに 'const NSString *'を送信すると、修飾子が破棄されます」という警告
時々、私はそれが便利だと思います。テーブルを渡す必要があり、テーブルの内容が変わらないことを確認したい場合があります。
しかし、ほとんどのObjective-Cプログラムのサンプルでは、私は決して見ませんconst
。私の質問はなぜですか?
回答:
Objective-Cオブジェクトの動作方法によりconst
、エンフォースメントをあきらめ、プログラマーの表記法になり始めます。このプログラムを検討してください:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
これは実際にはここではコンパイルされません(私はclangを使用しています):コンパイラーはプリミティブCタイプを変更しようとする試みを検出でき、エラーを出力します。しかし、今このプログラムと比較してください:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
関数には定数オブジェクトへの定数ポインターが渡されますが、それでもオブジェクトを変更することは可能です。
オブジェクト指向プログラミングでは、オブジェクトの一定の性質を強制する最善の方法は、そのオブジェクトを不変にすることです。つまり、その状態を変更できるメソッドを提供しません。上記の関数がのNSString
代わりに引数を取り、可変コピーの代わりにNSMutableString
リテラル@"Hello"
を渡したと想像してください。合理的に言えば、渡されたオブジェクトを変更する機会はありません[*]。Objective-Cのは、しかし、とは異なり、強制のいずれかの方法ではありませんconst
か、final
他のオブジェクト指向言語でオブジェクト参照を。
比較のために、const
C ++ではまったく異なる動作をします。const
C ++オブジェクトへの参照を取得した場合const
、そのオブジェクトのメンバー関数を呼び出すことしかできません。これらの関数const
は、変更を加えないかmutable
、クラスデザイナーによって明示的にマークされたメンバー変数のみを変更することにより、オブジェクトの-nessを保持します。したがって、Objective-C MutableString
と同等のC ++の型があると想像してくださいNSMutableString
。上記の私の例と同等のものは次のようになります。
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
これは間違いなくコンパイルされappendString()
ません。const
操作ではないことに加えて、関数はconst
を必要とする型参照から修飾子を削除しconst_cast
ます。
[*]いくつかのゆがんだ方法があると思いますが、今ではあるプログラマーが「賢い」ことをすることで別のプログラマーを妨害しようとしているという領域にいます。
const
のポインタが別のオブジェクトを指すように決して割り当てられないと述べるために、Objective Cでまだ役に立つと思う。とつまりNSString * const x
、あなたはそれが知っているx
、常に同じ文字列ではなく別の文字列になります。
Objective Cに関する限り、私はプログラミングしていませんので、質問に答えることはできません。私が答えることができる質問は、「const
Objective Cでプログラミングするとき、人々はたくさん使うべきでしょうか?」です。-それは明確な「はい」です。
Constnessは基本的に、プログラムの信頼性と保守性を高めるために使用されるソフトウェアセキュリティ機能です。多くのプログラマーはconst
s の価値をあまり評価することなく成長し、ある日何か悪いことが起こり、「あはは」という瞬間があります-「あー、それconst
が使われている」。定数なしでプログラムを書くことは完全に可能であり、そのようなプログラムを信頼できるものにすることは事実上不可能です。
コードのサンプルの多くは、実際にはプログラムではなく、特定の機能を示すように設計されたスニペットです。const
サンプルが作成しようとしているポイントから注意をそらすので、彼らは使用しません。あなたが見る他のタイプのコードは、彼らが学んだ例に基づいて何をするか、または定数について知っており、それらを使用するのが面倒である経験の浅いプログラマーによって書かれたコードです。
私はobjective-cを非常に長い間使用していません。
しかし、なぜこの側面に言及している身体がないのだろうか。
Objective-cには、定数に関連するものが既にあります。可変性
たとえば、Nstring *は定数文字列を指します。変更できる文字列が必要な場合は、NMutableStringなどを使用します。そのNMutableStringは、ユーザーが文字列を変更できるようにする追加のメソッドを提供します。
ポインター自体を定数にしたい場合はどうでしょう。非常に大規模なプロジェクトをコーディングしている間、そのことを心配する必要はありません。
それが理由だと思います。