これは非常に簡単な質問です。私が実装して、クラスチェックインコンストラクタ対セット機能
class A
{
public:
A(int);
void setA(int);
private:
int a;
};
があるとし
A::A(int a_) : a(a_) { }
void A::setA(int a_) { a = a_; }
、私はちょうどa = 1
で有効なオブジェクトを維持したいのは、私がa = 0
を持つ避けたいと言うが、私は例外をスローする必要はありませんしましょうその場合は代わりに(それは今のところ問題ではありません)。
次に、ifステートメントをコンストラクタに追加してsetA
に追加して、パラメータが0かどうかを確認し、その場合は1に設定できます。概念的には、この場合、コンストラクタを変更する必要があり、a
を初期化する代わりに、setA
をコンストラクタに呼び出す必要があることがわかります。このようにして、チェックのコードは1回だけ書き込まれます(これは単純な状況ですが、他の状況では検証がより複雑になる可能性があることに注意してください)。
このアプローチでは、コンストラクタで余分な関数呼び出しを行う必要があります。検証コードを2回書く方が効率的ですか? setA
が散発的にしか使用されない場合はどうですか?
とにかくインライン化され、 'setA'でそれを追加し、コンストラクタで' setA'を呼び出します。これらについて心配するのをやめてください(実際にはそうではないようですが)パフォーマンスの違い。きれいなコードを書く。オプティマイザが残りの作業を行います。 –
パラメータの名前を変更する必要はありません。 'A :: A(int a):a(a){}'は問題ありません。 – nwp
@nwpうわー、私はそれを知らなかった。私はこれがいつ行われたかを知るために、言語弁護士の質問をするつもりでしたが、明らかにこれはしばらくの間のことでした:http://stackoverflow.com/q/6185020/2642059 –