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