web-dev-qa-db-ja.com

int x; int y; int * ptr;初期化ではありませんよね?

J. P.ミューラーとJ.コグスウェルによる「ダミーのためのC++オールインワン」を読んでいて、これにつまずいた:

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...

このコードは、関連するすべての利点(2つの整数と整数へのポインター)を初期化することから始まります。

確認するために、これは間違いであり、「...宣言によって」と読む必要がありますよね?そのような基本的な間違いがまだ本に向かっているのは私には奇妙なことです。

24
John Allison

言語の観点から見ると、これは デフォルトの初期化 です。問題は、それらが不定値に初期化されることです。

それ以外の場合、何も実行されません。自動ストレージ期間を持つオブジェクト(およびそのサブオブジェクト)は、不定値に初期化されます。

自動および動的ストレージ期間を使用した非クラス変数のデフォルトの初期化では、不定値のオブジェクトが生成されます(静的およびスレッドローカルオブジェクトはゼロで初期化されます)

これらの不定値を読み取ろうとすると、 [〜#〜] ub [〜#〜] になります。

標準から、 [dcl.init]/7

タイプTのオブジェクトをデフォルトで初期化するには、次のことを意味します。

  • Tが(おそらくcvで修飾された)クラス型([class])の場合、コンストラクターが考慮されます。適用可能なコンストラクターが列挙され([over.match.ctor])、初期化子()に最適なコンストラクターがオーバーロード解決([over.match])によって選択されます。このようにして選択されたコンストラクターは、空の引数リストを使用して呼び出され、オブジェクトを初期化します。

  • Tが配列型の場合、各要素はデフォルトで初期化されます。

  • それ以外の場合、初期化は実行されません。

23
songyuanyao

はい。それで合っています。

あなたは宣言およびdefinedこれらの変数は、あなたがしたnotそれらを初期化します!

PS: 定義と宣言の違いは何ですか?

7
gsamaras

このコードはdeclaresdefinesの3つの変数の両方ですが、initializeの変数はありません(それらの値はと言われます) indeterminate)。

変数宣言には、キーワードexternのみを含める必要があります。

4

右。したがって、「ダミー」。 :)

これをレガシーのせいにすることはできません。歴史的には、Cプログラマーは変数を宣言*してから、最初の割り当てで変数を「初期化」していました。

しかし、初期化子なしで変数を単に宣言することは、それを「初期化する」とみなされることは決してありません。**

そのため、言葉遣いは間違っています。

*技術的には 定義について話している ですが、「変数を宣言する」と言うとき、ほとんどの場合、宣言を定義することを意味します。

**静的な保存期間を持つオブジェクトは、他の何かが起こる前に独自のゼロ初期化フェーズを経ますが、その場合、自分で初期化を忘れることは大惨事ではありません。それでも、そのオブジェクトを初期化したと主張することはできません。