C++的初始化與清除(補充1)

《c++編程思想》閱讀筆記(5)

這是第4章初始化與清除 , 的第一個補充,包括一些不是構造和析構函數的內容。。。


1)c++中的for循環計數

在c++中,我們將經常看到for循環的計數器直接在for表達式中定義:

for (int i = 0; i < 10; i++) {
        cout << i << endl;
    }

上述聲明是一種重要的特殊情況,這可能是那些剛接觸c++的程序員感到迷惑不解。
變量i是在for表達式中直接定義的(在c中我們不能這樣做),然後它就作爲一個變量在for循環中使用。這給程序員帶來很大的方便,因爲從上下文中我們可以很清楚地知道變量i的作用,所以不必再用諸如i_loop_counter之類的名字來定義一個變量,以表示這個變量的作用。

這裏有一個變量生存期的問題,這以前這是有程序塊的右大括號來確定的。而作爲程序員,我們顯然想讓i只在循環內部有效。因而在新的標準的c++說明書上說,一個在for循環的控制表達式中定義的循環技術器只在該循環內纔有效,所以上面的聲明是可行的。


2)switch語句可能跳過構造函數的調用點

switch語句可能跳過構造函數的調用點,然而這個對象會在後面的程序塊中起作用,這樣,構造函數就沒有被調用,所以編譯器給出了一條出錯信息。這就確保了對象在產生的同時被初始化。eg:

switch(i) {
  case 1 :
    X x2;  // constructor called here
    break;
  case 2 :  // Error: case bypasses init
    X x3;
    break;
}

(然後後面的代碼中出現了關於x2 的使用情況,那麼就有可能出現x2 在前面沒有被定義就被使用了)

3)集合初始化

集合,就是多個事物聚集在一起。這個定義包括各種類型的集合:像struct和class等。數組就是單一類型的集合。
初始化集合往往既冗長又容易出錯。而c++中集合的初始化卻變得方便而且很安全。當我們產生一個個集合對象時,我們要做的只是指定初始值就行了,然後初始化工作就由編譯器去承擔了。


數組有一種叫自動計數的快速初始化方法,就是讓編譯器按初始化值的個數去決定數組的大小:
int c[] = {1, 2, 3, 4};
然後,用表達式
sizeof c / sizeof *c (整個數組的大小除以第一個元素的大小)即可算出這個數組的大小。eg:

for (int i = 0; i < sizeof(c) / sizeof (*c); i++);

現在,如果我們決定增加其他的元素到這個數組上,只要增加一個初始化的值即可。如果以此建立我們的代碼,只需要在一處做出修改即可。這樣,我們在修改時出錯的機會就減少了.


如何構造類的集合呢?
我們必須指示構造函數調用,最好的方法像下面這樣:

class Y {
  privatefloat f;
    int i;
  public:
    Y(int A); // presumably assigned to i
};

Y y2[] = {Y[1], Y[2], Y[3]};

這樣我們就得到了三個對象和進行了三次構造函數調用。只要有構造函數,無論是所有成員都是公共的struct還是一個帶有私有成員的class,所有初始化工作都必須通過構造函數,即使我們正在對一個集合初始化。
另外一個例子:

class X {
  int i, j;
public :
  X(int I, int J) {
    i = I;
    j = J;
  }
};

int main() {
  X xx[] = {X(1, 2), X(3, 4), X(5, 6), X(7, 8)};
  return 0;
}

注意,它看上去就像數組中的每個對象都對一個沒有命名的構造函數調用了一次一樣

發佈了40 篇原創文章 · 獲贊 68 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章