11

私のコードでは次のことを行っていますが、それが「許可」されているのか、それとも優れた設計手法であるのかはわかりません。空のコンストラクターを作成する必要がありますが、パラメーターを指定して変数を初期化するコンストラクターも必要です。だから私は次のことをしています:

これはChファイルです。

 class C
 {
   private:
    string A;
    double B;
   public:
   //empty constructor
   C();
   C(string, double);  
 }

そして私のC.cppファイル:

//this is how I declare the empty constructor
 C::C()
  {

  }


  C::C(string a, double b)
  {
         A = a;
         B = b;
  }

空のコンストラクターを正しく宣言する方法ですか、それともA=NULLおよびB=0.0を設定する必要がありますか?

4

7 に答える 7

12

空のコンストラクターはあなたが望むことをしません。自分で行わない限り、doubleデータメンバーはゼロで初期化されません。はstd::string空の文字列に初期化されます。したがって、デフォルトのコンストラクターの正しい実装は単純に次のようになります。

C::C() : B() {} // zero-initializes B

他のコンストラクターに関しては、初期化リストを優先する必要があります。

C::C(const string& a, double b) : A(a), B(b) {}

それ以外の場合、実行しているのは、デフォルトの構築済みオブジェクトへの割り当てです。

于 2013-02-17T08:10:03.503 に答える
6

C ++ 11以降では、以下を使用してデフォルトのパラメーターなしコンストラクターを生成できます。

C() = default;

これはC(){}よりもきれいです。

これはメンバーを初期化しません。C ++ 11では、同じ宣言行でメンバーを初期化できます。

int m_member = 0; // this is a class member

これらの2つの機能により、デフォルトの初期化メンバーに独自のパラメーターなしコンストラクターを作成する必要がなくなります。したがって、これら2つの機能を適用すると、クラスは次のようになります。

class C
{
private:
    string A;
    double B = 0;

public:
   C() = default;
   C(string, double);  
}
于 2019-05-29T12:27:03.710 に答える
5

これを実行してコンストラクターを空のままにしておくことは問題ありませんが、初期化されていないフィールドには未定義の値があることに注意する必要があります。stringはクラスであり、デフォルトのコンストラクターが初期化を処理しますが、doubleここでは初期化されず(defualtコンストラクターで)、その値は未定義です(以前にメモリに存在していた値であれば何でもかまいません)。

于 2013-02-17T04:46:39.417 に答える
2

Aはstd::string、に設定することはできませんがNULL、空の文字列に設定でき、std::stringデフォルトで空の文字列に初期化するデフォルトのコンストラクタがあります。

C::C()
:B(0.0)
{
}

たぶん、2つのコンストラクターの代わりに、デフォルトのパラメーターを持つコンストラクターコンストラクターが必要ですか?

C(const string& a= "", double b= 0.0)
: A(a),
  B(b)
{
}
于 2013-02-17T04:44:52.743 に答える
2

この質問に答えることができるのはあなただけです。これは、デフォルトで作成されたオブジェクトの要件に完全に依存しているためです。あなたはあなたの要件が何であるかについて言及していないので、決定的な答えを与えることは不可能です。0に初期化する必要があると考える人もいますBが、その決定は、「優れた」プログラミング手法のさまざまな概念ではなく、設計に基づいて行う必要があります。

于 2013-02-17T13:28:34.463 に答える
1

そのままにしておいてかまいません。との両方stringdoubleデフォルトで構築できるため、これを行うことができます。string foo;あなたが言うことができ、エラーが発生しないことを意味します。

これをここで起こることと比較してください:

class Bar{
    private:
        Bar(); //Explicitly private;
};
Bar b;

Bar::Bar()ここで、コンストラクターが見つからないというエラーが発生します。

それが良い考えであるかどうかについて:このクラスが使用される状況を知らずに言うのは難しいです。おそらく、それを未構成の位置に置くことは完全に賢明です。しかし、たとえばファイルを表すクラスなど、多くのクラスでは、どのファイルも指さないファイルオブジェクトを許可することは明らかに間違っています。

于 2013-02-17T04:42:04.743 に答える
0

あなたはそれを正しくやっていて、あなたはあなたのコードをコンパイルすることによってそれを見ることができます。デフォルトのコンストラクターは文字列を初期化し、デフォルトのコンストラクターを呼び出すことでdoubleします。クラスでコンストラクターを定義すると、コンパイラーによって作成されたデフォルトのコンストラクターが非表示になります。

このように書くことでコンストラクターコードを改善できます

C::C(string a, double b):A(a), b(b)
{
}
于 2013-02-17T04:45:07.363 に答える