あなたの質問に答える前に(この投稿の最後にあります)、関数に引数を渡すための可能性の簡単な要約を次に示します。
1.コピー構築されたオブジェクト(値渡し):
void cp(point p);
これは値渡しです。一時オブジェクトは、渡したオブジェクトpoint
から作成およびコピー構築されます。実行が関数を離れると、一時オブジェクトは破棄されます。point
cp
cp
関数は関数に渡されたもののコピーを操作するため、そのローカルpoint
オブジェクトを必要なだけ変更でき、呼び出し元の元のオブジェクトは影響を受けないことに注意してください。値渡しパラメーターを使用してこの動作を変更する方法はありません。
2.オブジェクトへの参照(参照渡し):
void cp(point& p);
これは参照渡しです。関数に渡された実際のオブジェクトは、関数内で使用可能です(変更される可能性があります)。関数が渡されたオブジェクトを変更できないようにする場合は、パラメーターを次のように宣言しますconst point&
。
void cp(const point& p);
3.オブジェクトへのポインタ(参照渡し):
void cp(point* p);
これも参照渡しですが、いくつかの微妙な違いがあります。注目すべき違いの1つは、関数にnullポインターを渡すことができることです。参照は初期化する必要があり、後で再装着できないため、これは参照では不可能です。cp
-参照と同様に、渡されたものの変更を禁止point
する場合は、constとして宣言します。
void cp(const point* p);
あなたの質問への答え:
値渡しパラメーターは、本質的に悪いものではありません。もちろん、コピーの作成に費用がかかるタイプ(たとえば、非常に大きいオブジェクトや複雑なオブジェクト)や、特定の副作用があるタイプ(たとえば、std::auto_ptr
)もあります。このような場合は注意が必要です。それ以外の場合、これはC ++のもう1つの機能であり、完全に合理的な用途があります。