はじめに
Effective C++ 第3版の4項18ページから勉強していきます。
今回は、「オブジェクトの初期化」についです。
Effective C++ 第3版 - 4項 オブジェクトは、使う前に初期化しよう -
オブジェクトの初期化
オブジェクトの初期化とは?
オブジェクトの初期化について、
int x;
std::cout << x << std::endl; // 0 or ?
のように書くと、xは、ある状況ではxは(0に)初期化され、別の状況では初期化されません。
また、
typedef struct {
int x;
int y;
int z;
} point_t;
point_t point;
std::cout << "point.x : " << point.x << std::endl; // 0 or ?
std::cout << "point.y : " << point.y << std::endl; // 0 or ?
std::cout << "point.z : " << point.z << std::endl; // 0 or ?
のように書くと、pointのデータは、ある状況では(0に)初期化され、別の状況では初期化されない。
初期化されていないオブジェクトの値を呼びだそうとすると、結果は未定義の動作になります。
よくあるのは、たまたまそのオブジェクトの中にあった「でたらめな値」を読みだす動作をします。
それに気が付かないと、プログラムが不思議な動作をするようになり、つらいデバッグ作業をしなけらばいけなくなります。
オブジェクトがいつ初期化され、いつ初期化されないかについては、ちゃんとルールがあります。
しかし、そのルールはとても複雑です。
そのため、「オブジェクトは、使う前に必ず初期化する」というが良い。
組み込み型の初期化は、以下のようなものがある。
int x2 = 0; // intの初期化
const char* text = "A C-style string"; // ポインタの初期化
double d; // 入力ストリームから
std::cout << "入力 : ";
std::cin >> d; // の読み込みによる初期化
このように、「オブジェクトは、使う前に必ず初期化する」ことで、「でたらめな値」を読みだす動作を防ぐことができます。
以下に、勉強で使用したコードを示します。
サンプルコード
# include <iostream>
// int は全ての状況で0に初期化されるわけではない。
typedef struct {
int x;
int y;
int z;
} point_t;
int main(int argc, char* argv[]) {
std::cout << "4_initialize_tutorial.cpp" << std::endl;
int x;
point_t point;
std::cout << "x : " << x << std::endl;
std::cout << "point.x : " << point.x << std::endl;
std::cout << "point.y : " << point.y << std::endl;
std::cout << "point.z : " << point.z << std::endl;
// ##############################################
// いろいろな初期化
int x2 = 0; // intの初期化
const char* text = "A C-style string"; // ポインタの初期化
double d; // 入力ストリームから
std::cout << "入力 : ";
std::cin >> d; // の読み込みによる初期化
std::cout << "x2 : " << x2 << std::endl;
std::cout << "text : " << text << std::endl;
std::cout << "d : " << d << std::endl;
}
実行結果
実行結果から分かるように、変数xは、「4197811」とよく分からない値を出力しています。
参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0