2016-05-09 1 views
1

まあ、私はC++クラスのconstデータメンバの機能を知っています。C++でのconstデータメンバの使用

私が知りたいのは、クラスにconstデータメンバを導入する目的です。なぜ誰かが実際のソフトウェアを書いている間にそれを使用するのでしょうか? constデータメンバの実際の使用状況は何ですか?

実生活の例をいくつか教えてください。

編集: 私は約static constのデータメンバーについて尋ねていません。 私は、各オブジェクトが同じデータに対して異なるconst値を持つような実際の使用例を求めています。

+8

建設時に決定されるクラス不変量については? –

+0

'constexpr static double pi = 3.14 ....' –

+1

@ paper.plane constではないデータメンバを持つ必要があるときに具体的な例を教えてください。私はconstがデフォルトであり、constは例外ではないと言うでしょう。 –

答えて

1

いくつかのケースがあります。最も明白なのは静的constデータメンバーです。 C++ 11以降の下で、constexprは通常、そのような場合には、より理にかなっていること

class Something { 
    static const int SOME_CONSTANT = 17; 
}; 

注:これらは、スコープの定数として使用されています。

これは、クラスの実装に入力されスコープされた定数を定義します。私はこれがあなたが求めていたものではないと考えています。

もっと興味深いのは、クラスのインスタンス間では異なるが、クラスのライフタイム全体で一定の値です。

たとえば、構成でストライプ幅を設定するRAID実装があるとします。コンパイル時にストライプ幅がわからないので、上記の構文は役に立ちません。しかし、あなたのコードはストライプ幅の変更を扱う方法を知らないかもしれません。

constの値をマーキングしてコンストラクタに設定すると、誰もこの値を変更しないというコンパイル時間の保証が得られます。

+0

ロジックに若干の欠陥があります。静的constexprであっても、クラスのインスタンス間で何かが異なる可能性があります。つまり、テンプレート引数から初期化されています。さらに、 'static const'は' static constexpr'(constexprはconstを意味します)とみなされます。パブリック 'const変数'は 'static constexpr'でもない理由もありません。 –

+0

私はクラスの異なるインスタンス化を "同じクラス"とは考えていません(コンパイラもどちらも同じではありません)。 2番目のコメントについては、実行時に計算可能な(グローバルメモリなどの)「グローバル」constが必要な場合があります。私はしばしばconstexprが意味を成し、答えを修正することに同意する –

2

あなたが任意のconstオブジェクトを使用していたものと同じ理由でconstデータメンバを使用したい:任意の初期化が、その後変更されませんすることができる値のために。

「デフォルトで」constと表示することをお勧めします。そのため、クラスで使用する理由を十分に理解することができます。

class User 
{ 
    User(const std::string& name) 
     : name(name) 
    {} 

private: 
    /** 
    * User's name is an invariant for the lifetime of this object. 
    */ 
    const std::string name; 
}; 

constはここに記載していますか?うん、確かに。しかし、間違ってnameを変更することになりました。 constの全目的は、そのような事故から保護することです。

しかし、残念ながら、あなたのクラスは割り当てられません!

はあなたがそれを定義したクラスに適用されます、あなただけにそれをしたいだけで、あなたがグローバルに宣言のconstを使用するとまったく同じそれを使用
+0

これは良い例です。したがって、銀行の記録に間違って記載されたあなたの名前の訂正が必要なときはいつでも、顧客ケアを呼び出して、コンストラクターで正しい名前の別のオブジェクトを作成し、古いオブジェクトで代入演算子を呼び出し、古いオブジェクト。 –

+0

@ paper.plane:名前を変更することがあなたのビジネスロジックで合法で有効であれば、あなたは 'const'を使わないでしょう。 "顧客番号"はおそらく 'const'でなければならないでしょう。 –

+0

あなたのポイント@Lightnessに同意しますが、名前の変更が許可されていることを考慮して、変更が必要なときに実装が正しいかどうかを尋ねています。 –

0

。例

class Character 
{ 
public: 
    Character() 
    : 
     mCurrentHealth{TOTAL_HEALTH}, 
     mCurrentMana{TOTAL_MANA} 
    { 
    } 

    // Define lose/gain health/mana functions 
    // for mCurrentHealth and mCurrentMana 
private: 
    int mCurrentHealth; 
    int mCurrentMana; 

    // Constants 
    const int TOTAL_HEALTH = 100; 
    const int TOTAL_MANA = 50; 
}; 

のために他の多くの例がありますが、主なポイントは、TOTAL_HEALTHとTOTAL_MANAがクラス外で定義されることを望まないということです。なぜなら、関連性がないからです。

関連する問題