ポインタと参照の構文と一般的なセマンティクスを理解していますが、APIで参照またはポインタを使用することが適切かどうかをどのように判断すればよいですか?
当然、状況によってはどちらか一方が必要です(operator++
参照引数が必要です)が、変数が破壊的に渡されていることは構文上明らかであるため、一般的にはポインタ(およびconstポインタ)を使用した方がよいと思います。
たとえば、次のコードで:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
ポインターを使用すると、何が起こっているのかが常に(さらに)明白になります。そのため、APIなどでは、明確さを重視する場合、ポインターは参照よりも適切ではありませんか?つまり、参照は必要な場合にのみ使用する必要があるということoperator++
ですか(例:)?どちらか一方にパフォーマンスの問題はありますか?
編集(古い):
NULL値を許可して生の配列を処理する以外に、選択は個人の好みに帰着するようです。GoogleのC ++スタイルガイドを参照する以下の回答を受け入れました。「値の構文はあるがポインタのセマンティクスがあるため、参照は混乱を招く可能性がある」という見解を示しているためです。
NULLであってはならないポインタ引数をサニタイズするために必要な追加の作業(たとえばadd_one(0)
、実行時にポインタバージョンを呼び出して中断する)のため、オブジェクトが存在しなければならない参照を使用することは保守性の観点からは残念ですが、意味があります。構文の明確さを失う。
add_one(a);
ということは不明であるa
のを修正することになるだろうか?それはコードの中で正しく言っています:1つ追加してください。
addOneTo(...)
ます。それがあなたがしたいことではない場合は、宣言を見てください。