14

私の知る限り、コピーコンストラクターはまたはの形式である必要がありT(const T&)ますT(T&)。署名にデフォルトの引数を追加したい場合はどうなりますか?

T(const T&, double f = 1.0);

それは標準に準拠していますか?

4

2 に答える 2

27

はい。

§[class.copy]/2:

クラスの非テンプレートコンストラクターXは、最初のパラメーターが、、、またはの型であり、他のパラメーターがないか、他のすべてのパラメーターにデフォルトの引数がある場合、コピーコンストラクターです[例:およびはコピーコンストラクターです。X&const X&volatile X&const volatile X& X::X(const X&)X::X(X&,int=1)

于 2010-05-07T09:44:57.577 に答える
6

2つの異なるコンストラクターを作成できます。

T(const T&)
T(const T&,double)

ただし、あなたが持っているものはコピーコンストラクタとして許可されています。

ちなみに、C ++でデフォルトのパラメーターを使用することは一般的に適切ではないことを発見しました。代わりに、パラメーターが少ないものがデフォルト値を使用してパラメーターが多いものを呼び出すオーバーロードを使用する方がはるかに優れています(もちろん、これはISO C ++ 2003のコンストラクターでは不可能ですが、コンストラクターの委任はISO C++201xで許可されています。この理由は、デフォルト値が関数に見かけの動作とは異なる実際の署名を与えるため、関数へのポインターを取得するときに多少困難/苦痛を伴うためです。オーバーロードを提供することにより、可能な各呼び出しタイプの関数ポインターを、それを機能させるための「バインディング」メカニズムを必要とせずに取得できます。

于 2010-05-07T09:48:31.887 に答える