複合類型是基於整形和浮點型建立的。影響最為深遠的複合類型是類。
1、數組
數組是一種資料格式,能夠儲存多個同類型的值。
typeName arrayName[arraySize]int months[12] = {1, 2, 3};其他元素將設定為0char name[4] = {'p', 'i', 'g', '\0'};
不能將一個數組賦值給另一個數組。
2、字串
儲存在記憶體的連續位元組中的一系列字元。C++處理字串的方式有兩種。一種來自C語言,常被稱為C-風格字串,另一種基於string類庫的方法。
C-風格字串:
以Null 字元 \0 結尾,其ASCII為0,用來標記字串的結尾。
char name[4] = {'p', 'i', 'g', '!'};//不是字串char name[4] = {'p', 'i', 'g', '\0'};//是字串
用引號括起的字串稱為字串常量或字串字面值,隱式包含結尾的Null 字元,如:
char bird[11] = "Mr. Cheeps";char fish[] = "Bubbles";strlen不計算Null 字元,strlen(bird) == 10strcpy(charr1, charr2);//copy charr2 to charr1strcat(charr1, charr2);//append contents of charr2 to charr1 strncpy(food, "a picnic basket filled with many goodies", 19);food[10] = '\0';
cin如何確定已完成字串的輸入?
由於不能通過鍵盤輸入Null 字元,因此cin需要用別的發那個發來確定字串的結尾位置。cin使用空白、定位字元和分行符號來確定字串的結束位置。
讀取一行:cin.getline()和cin.get()。
這兩個函數否讀取一行輸入,直到達到分行符號。不同的是,cin.getline()將丟棄分行符號,get將保留分行符號在輸入序列中。
cin.getline(fish, 20);
cin.get()讀取下一個字元
string類
可以使用C-風格字串來初始化string對象,如string str2 = "test";
可以使用cin、cout來輸入或輸出string對象
可以使用數組標記法來訪問儲存在string對象中的字元
可以將一個string對象賦值給另一個string對象,string類與C-風格字串
#include <iostream>#include <string> using namespace std; void main(){ char char1[20]; char char2[20] = "c string"; string str1; string str2 = "string"; str1 = str2; strcpy(char1, char2); str1 += " !"; strcat(char1, " !"); int len1 = strlen(char1); int len2 = str1.size(); cout << char1 << endl << str1 << endl;}string類讀取一行 getline(cin, str);3、結構和結構數組struct sname{ int id; char name[20]; };void main(){ sname s[1]; s[0].id = 1; strcpy(s[0].name, "pig"); cout << s[0].id << ":" << s[0].name << endl;}
4、共用體
共用體能儲存不同的資料類型,但只能同時儲存其中的一種類型。
5、枚舉
enum 枚舉名{
標識符[=整型常數],
標識符[=整型常數],
...
標識符[=整型常數],
} 枚舉變數;
enum spectrum{red = 1, orange, yellow, green, blue};
只能將整型賦值給枚舉。
6、指標 - 變數的地址
OOP強調的是在運行階段(而不是編譯階段)進行決策。
指標:用於儲存值的地址。*運算子被成為間接值或解除引用運算子,將其應用與指標,可以得到該地址處儲存的值。
int * id;
char *pc = new char;
通常情況下,地址需要2個還是4個位元組取決於電腦系統。
一定要在對指標應用解除引用運算子之前,將指標初始化一個確定的、適當的地址。
C語言可通過malloc來分配記憶體;在C++中仍然可以這樣做,但C++還有更好的方法 - new運算子。
為一個資料對象(可以是結構,也可以是基本類型)獲得並指定分配記憶體的通用格式如下:
typeName * pointer_name = new typeName;
new分配的記憶體塊通常與常規變數聲明分配的記憶體塊不同。常規變數儲存在棧中,而new儲存在堆或自由儲存區的記憶體地區中。
使用new分配的記憶體需要使用delete來釋放,一定要配對使用new和delete,否則將發生記憶體流失,也就是說,被分配的記憶體再也無法使用了。如果使用new時帶方括弧,則delete也應帶上,如果沒帶,則不用帶。
new和delte遵守規則
不要使用delete來釋放不是new分配的記憶體
不要使用delete釋放同一個記憶卡兩次
如果使用new [] 為數組分配記憶體,則應使用delete []來釋放
如果使用new為一個實體分配記憶體,則應使用delete來釋放
對null 指標應用delete是安全的。
在編譯時間給數組分配記憶體稱為靜態聯編,在運行時動態分配稱為動態聯編。
使用new建立動態數組
為數組分配記憶體的通過格式
typeName * pointer_name = new typeName[num_elements];int * psome = new int[10];delete [] psome;
使用動態數組
指標指向記憶體塊中的第一個元素,所以*psome是第一個元素的值。也可使用數組的方式來訪問,如psome[2]
數組與指標基本等價是C和C++的優點之一
C++將數組名解釋為地址
指標變數加1後,增加的量等於它指向的類型的位元組數。
對數組使用sizeof運算子得到的是數組的長度,而指標使用sizeof得到的是指標的長度,即使指標指向的是一個數組。
數組名被解釋為第一個元素的地址,對數組名應用地址符時,得到的是整個數組的地址。
short tell[10];cout << tell << endl;cout << &tell << endl;
從數字上說,這兩個地址相同。但從機率上說,&tell[0]是一個2位元組記憶體塊的地址,而&tell是以一個20位元組的記憶體塊的地址。因此,運算式tell+1將地址值增加2,而&tell+2將地址加20.
如果結構標識符是結構名,則使用句點運算子;如果標識符是指向結構的指標,則使用箭頭運算子(->)
自動儲存、靜態儲存和動態儲存裝置
數組的替代品
模板類vector
vector<typeName> vt(n_elem);
n_elem可以是整形常量,也可以是整形變數
模版類array
array<typeName, n_elem> arr;
與建立vector不同,n_elem不能是變數
數組、vector、array都可使用標準數組標記法來訪問各個元素。
--EOF--