LoginSignup
0
0

More than 3 years have passed since last update.

勉強記録 14日目 〜オブジェクトの初期化〜 - Effective C++ 第3版 -

Posted at

 はじめに

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;                          // の読み込みによる初期化

このように、「オブジェクトは、使う前に必ず初期化する」ことで、「でたらめな値」を読みだす動作を防ぐことができます。

以下に、勉強で使用したコードを示します。

サンプルコード

4_initialize_tutorial.cpp
#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;
}

実行結果

4_initialize_tutorial.png

実行結果から分かるように、変数xは、「4197811」とよく分からない値を出力しています。

参考文献

https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0