C++編程語言中有很多比較重要的概念,需要我們不斷的去學習。比如今天為大家介紹的C++集合初始化的相關概念,就是一個比較重要的應用技術。那麼我們就一起來看看這方面的內容吧。
C++集合初始化往往既冗長又容易出錯。而C++中集合的初始化卻變得很方便而且很安全。當我們產生一個集合對像時,我們要做的只是指定初始值就行了,然後初始化工作就由編譯器去
承擔了。這種指定可以用幾種不同的風格,取決於我們正在處理的集合類型。但不管是哪種情況,指定的初值都要用大括號括起來。比如一個預定義類型的數組可以這樣定義:
- int a[5]={1,2,3,4,5};
如果給出的初始化值多於數組元素的個數,編譯器就會給出一條出錯信息。但如果給的初始化值少於數組元素的個數,那將會怎麼樣呢?例如:
- int b[6]={0};
這時,編譯器會把第一個初始化值賦給數組的第一個元素,然後用0賦給其余的元素。注意,如果我們定義了一個數組而沒有給出一列初始值時,編譯器並不會去做這些工作。所以上面的表達式是將一個數組初始化為零的簡潔方法,它不需要用一個f o r循環,也避免了“偏移1位”錯誤它可能比f o r循環更有效,這依賴於編譯器)。
數組還有一種叫自動計數的快速初始化方法,就是讓編譯器按初始化值的個數去決定數組的大小:
- int c[] = {1,2,3,4};
現在,如果我們決定增加其他的元素到這個數組上,只要增加一個初始化值即可,如果以此建立我們的代碼,只需在一處作出修改即可,這樣,我們在修改時出錯的機會就減少了。但怎樣確定這個數組的大小呢?用表達式sizeof c/sizeof *c(整個數組的大小除以第一個元素的大小)即可算出,這樣,當數組大小改變時它無需修改。
- for(int i = 0; i< sizeof c / sizeof *c; i++)
- c [ i ] + + ;
s t r u c t也是一種C++集合初始化類型,它們也可以用同樣的方式初始化。因為C風格的s t r u c t的所有成員都是公共型的,所以它們的值可以直接指定:
- struct X {
- int i;
- float f;
- char c;
- } ;
- X x1 = {1,2.2,'c' };
如果我們有一個這種s t r u c t的數組,我們也可以用嵌套的大括號來初始化每一個對象。
- X x2[3] = {{1,1.1, 'a'},{2,2.2, 'b'}};
這裡,第三個對象被初始化為零。
如果s t r u c t中有私有成員,或即使所有成員都是公共成員,但有一個構造函數,情況就不一樣了。在上例中,初始值被直接賦給了集合中的每個元素,但構造函數是通過外在的接口
來強制初始化的。這裡,構造函數必須被調用來完成初始化,因此,如果有一個下面的s t r u c t類型:
- struct Y {
- float f;
- int i;
- Y(int A); // presumably assigned to i
- } ;
我們必須指示構造函數調用,最好的方法像下面這樣:
- Y y2[] = {Y(1),Y(2),Y(3)};
這樣我們就得到了三個對象和進行了三次構造函數調用。只要有構造函數,無論是所有成員都是公共的s t r u c t還是一個帶私有成員的c l a s s ,所有的初始化工作都必須通過構造函數,即使
我們正在對一個C++集合初始化。