天天看點

[C++再學習系列] 變量與聲明時初始化

      未初始化的變量常常會導緻一些奇怪的bug,有時還真不好調式。養成在初始化變量的習慣有利于減少程式設計錯誤,提高程式品質。

      C++提供了構造和析構函數,其中構造函數就是為初始化而設計的;對于内置變量(char,int,long等)的初始化C++無能為力,其預設行為是未初始化,故其值依賴于變量類型(是否為static)和編譯器。

      本文中将讨論兩類基本變量:标量和數組,标量指單一變量,數組本質上就是一整塊記憶體空間(别忘了memset)。其他資料結構均基于這兩類基本變量,一般由庫提供,比如著名的C++ STL容器。

聲明時初始化的格式直接參見代碼中的注釋。

<a></a>

1 #include &lt;errno.h&gt;

2 #include &lt;math.h&gt;

3 #include &lt;stdio.h&gt;

4 #include &lt;stdlib.h&gt;

5 #include &lt;string.h&gt;

6

7  void Print(int* buf, int len)

8 {

9 printf("Value(int)= ");

10 for(int i=0; i&lt;len; ++i)

11 {

12 printf("%d", buf[i]);

13 }

14 printf("\n");

15 }

16

17  void Print(char* buf, int len)

18 {

19 printf("Value(char)= ");

20 for(int i=0; i&lt;len; ++i)

21 {

22 printf("%c", buf[i]);

23 }

24 printf("\n");

25 }

26

27 int main(int argc, char** argv)

28 {

29 printf("scale variable:\n");

30 //1. scale variable

31 char v1; // not initialization. Value depends on compiler

32 Print(&amp;v1, 1);

33

34 char v2 = '1'; // user initialization

35 Print(&amp;v2, 1);

36

37 char* v3 = new char; // not initialization. Value depends on compiler

38 Print(v3, 1);

39

40 char* v4 = new char(); // zeroing initialization. value is 0;

41 Print(v4, 1);

42

43 char* v5 = new char('A'); // user initialization

44 Print(v5, 1);

45

46 int* i5 = new int(1243214); // user initialization

47 Print(i5, 1);

48

49

50 printf("array variable:\n");

51 //2. array

52 char a[10]; // not initialization. Value depends on compiler

53 Print(a, 10);

54

55 char b[10] = {}; // same as {0}; zeroing initialization.

56 Print(b, 10);

57

58 char b1[10] = {'a'}; // b[0]='a', other is 0!

59 Print(b1, 10);

60

61 char* c = new char[10]; // not initialization. Value depends on compiler

62 Print(c, 10);

63

64 char* d = new char[10](); // zeroing initialization. 經追海逐風證明,g++無此功能

65 Print(d, 10);

66

67 // char* e = new char[10]('a'); // Error: ISO C++ forbids initialization in array new

68 // Print(e, 10);

69

70 return 0;

71 }

72

繼續閱讀