5

GManのコメントを読んだだけです

class A
{
public:
   A() :
      m_ptr() // m_ptr is implicitly initialized to NULL
   { }
};

優先する必要があります

class A
{
public:
   A() :
      m_ptr(NULL) // m_ptr is explicitly initialized to NULL
   { }
};

NULL最初の例には欠けていることに注意してください。

GManは正しいですか?これは主観的なものかもしれないので、「デフォルトの初期化には空の初期化子を使用しますか?」より適切かもしれません。

また、空の初期化子を好む場合、これは他の統合メンバーに適用されますか?

class B
{
public:
   B() :
      m_count(),
      m_elapsed_secs()
   {}
private:
   std::size_t m_count;
   float m_elapsed_secs;  //the elapsed time since instantiation
};

もちろん、一方が他方よりも優先されるべき理由の説明であなたの視点を擁護してください。

4

4 に答える 4

7

私は明示性を好みます。この質問に対するいくつかの間違った答えが示しているように、誰もが言うこと、int()そしてint(0)同等であることは明らかではありません。

明示的な値を指定しないことには、タイプを変更した場合に初期化リストに再度アクセスする必要がないという利点があると思います。

于 2010-07-07T19:14:25.983 に答える
2

依存型のメンバーをデフォルトで初期化するテンプレートクラスを作成する場合は、デフォルトの初期化が必要です。その他の場合、メンバーをデフォルトで初期化する場合、実際の違いはありません。ただし、デフォルト以外の動作を取得したい場合があります。

デフォルトの初期化が適切でない場合の1つのサンプル:

struct X {
  HANDLE some_file_handle;
  // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows
  X() : some_file_handle( INVALID_HANDLE_VALUE ) {} 
};

使用NULLとデフォルトの初期化については、もう1つの例があります。C++0xに準拠していると宣言されているVisualStudio 2010ではNULL、0として定義されていますが、C++0xではnullptrポインターの初期化に使用する必要があります。またnullptr、C++'03では定義されていません。しかし、おそらくコードを移植可能にしたいでしょう。その場合(ポインタを初期化するため)、値の初期化よりもデフォルトの初期化を優先します。

于 2010-07-07T19:26:51.887 に答える
2

最初に、私はそれがそうであるということではなく、間違いなくより良いと言いました。:)また、それはもっと取り除くことについてでしたNULL; たまたま0の代わりに何も使用していません。しかし、とにかく興味深い質問です。

それはおそらくスタイルの問題ですが、ヨハネスがしたように、それは単なる構文上のスタイルではないことに注意することが重要です。彼らは異なることをします。それらの異なるものを同じにするのは簡単です。

値の初期化方法には一切関与していないため、値の初期化を好みます。私は単に「初期化される」と言っています。逆に、値を導入すると、値の初期化方法に影響を与えます。

値の初期化が明らかに優れている状況を見つけるのは難しいと思います。どちらが自分に合っているかを選択するだけです。

于 2010-07-07T19:27:17.360 に答える
-1

それらは異なるものだと思いますが、意味が同じであると混同NULLしている可能性はありますが、そうではありません(C++では0と同等です)voidint main()int main(void)int main(NULL)NULL

于 2010-07-07T19:06:43.323 に答える