第四章 複合類型
本章節會包含下列內容
- 創建和使用數組
- 創建和使用C-風格字符串
- 創建和使用string字符串
- 使用方法get()和getling()讀取字符串
- 混和輸入字符串和數字
- 創建和使用結構
- 創建和使用共同體
- 創建和使用枚舉
- 創建和使用指針
- 使用new和delete管理動態內存
- 創建動態數組
- 創見動態結構
- 自動存儲、靜態存儲和動態存儲
- vector和array類簡介
一、數組
數組(array)是一種數據格式,能夠存儲多個同類型的值。
要創建數組,可以使用聲明語句,聲明語句要指出以下三點:
- 存儲在每個元素中類型的
- 數組名
- 數組中的元素數
聲明數組的通用格式如下:
typeName arrayName[arraySize];
arraySize指定元素數目,它必須是整型常數或const值,即必須是已知的,不能是變量。
以下為範例:
short month[12]; //creat array of 12 short
數組織所已被稱為複合類型的,是因為它是使用其他類型來創建的
數組可以單獨訪問數組元素,方法是使用下標來對元素進行編號。C++的數組是由0開始進行編號的
1.程序說明
以下範例程序說明數組的一些屬性,包刮聲明數組、給數組元素賦值、以及初始化數組:
#include <iostream> int main(){ using namespace std; int yams[3]; //聲明數組 yams[0] = 7; //對每一個數組元素賦值 yams[1] = 8; yams[2] = 6; int yamcosts[3] = {20,30,5}; //聲明數組,同時賦值給前三個元素 cout<<"Total yams = "; cout<<yams[0] +yams[1] + yams[2]<<endl; cout<<"The package with "<<yams[1]<<" yams costs "; cout<<yamcosts[1]<<" cents per yam. \n"; int total = yams[0]*yamcosts[0] + yams[1]* yamcosts[1]; //將兩個數組的第一個元素相乘,第二個元素相乘 total = total + yams[2]*yamcosts[2]; //將剛剛的total再加上第三個元素相乘,在賦新的值給total cout<<"The total yam expense is "<<total<<" cents.\n"; cout<<"\nSize of yams array = "<<sizeof yams; //sizeof 返回類型或數據對象的長度 cout<<" bytes.\n"; cout<<"Size of one element = "<<sizeof yams[0]; cout<<" bytes.\n"; return 0; }
2.數組初始化的規則
C++有幾條關於初始化數組的規則:
- 只有在定義數組時才能使用初始化。
- 可以使用下標,分別給數組中的元素賦值。
- 如果只對數組的一部分進行初始化,其他元素將被設置為0。
- 將數組中所有的元素都初始化為0,只要將第一個元素初始化為0,然後讓編譯器將其他元素都初始化為0即可。
3.C++11數組初始化方法
- 初始化數組時,可以省略等號( = )
- 可以不在大括號內包含任何東西,這將把所有數值設置為零
- 列表初始化禁止縮窄轉換(例如、將long 存到 int)
二、字符串
C++處理字符串的方式有兩種
- C語言的C風格字符串(C-style-string)
- string類庫
可以將字符串存儲在 char 數組中,C風格字符串的特殊性質就是以空字符(null character)做結尾
空字符被寫作 \0
以下兩個都是char數組,但只有第二個才是字符串
char dog[8] = {'a','b','c','s',' ','e','r','t'}; char cat[8] = {'a','b','c','s','h','e','r','\0'}
以下是將字符數組初始化為字符串的方法,只需使用一個引號括起字符串即可
這種字符串被稱為:字符串常量、或是字符字面值
※用引號括起的字符串包含結尾空字符,因此不用顯示的包括它
char bird[11] ="Mr. Cheeps"; char fish[] = "Bubbles"; //let the compiler count
1.拼接字符串
有時候,字符串很長,C++允許拼接字串字面值,任何兩個由空白(空格、換行符、制表符)的字串符常量,都會自動拼接持一個
下面所有輸出都是等效的:
cout<<"ivan is a pig!" "clover is a girl"; cout<<"ivan is a pig!clover is a girl"; cout<<"ivan is a p" "ig!clover is a girl";
2.在數組中使用字符串
有兩種方法:
將數組初始化為字符串常量
將鍵盤或文件輸入讀入到數組中
#include<iostream> #include<cstring> using namespace std; int main(){ const int Size = 15; char name1[Size]; char name2[Size] = "C++owboy"; cout<<"Howdy! I'm "<<name2; cout<<"! What's your name?\n"; cin>>name1; cout<<"Well, "<<name1<<", your name has "; cout<< strlen(name1) << " letters and is stored\n"; cout<<"in an array of "<<sizeof(name1)<<" bytes.\n"; cout<<"Your initial is "<<name1[0]<<"\n"; name2[3]='\0'; cout<<"Here are the first 3 characters of my name:"; cout<<name2<<endl; return 0; }
sizeof 運算出整個數組的長度
strlen()函數返回的是存儲在數組中字符的長度,而不是數組本身的長度
另外,strlen()只計算可見的字符,而不把空字符計算在內
舉例來說、如果clover是個字符串,則存儲該字符串的數組長度不能短於strlen(clover)+1
3.每次讀取一行輸入
每次讀取一個單詞,例如New York,你希望程序是讀取並存儲完整的城市名,需要採用面向行而不是面向單詞的方法
1.面向行的輸入:getline()
getline()函數讀取整行,他透過回車鍵(輸入鍵)輸入的換行符來確定結尾,但不保存換行符
他在存儲字符的時候,則用空字符來代替換行符
可以使用 cin.getline() 該函式有兩個參數:
第一個用來存儲輸入行的數組名稱,第二個參數是要讀取的字符數
2.面向行的輸入:get()
get()函數讀取整行,他透過回車鍵(輸入鍵)輸入的換行符來確定結尾,且會保存換行符
但因為會保存換行符,因此二次跳用get()會因為讀取到前面一次的換行符結尾而沒讀取道任何內容
這時候要用 cin.get(); 讀取一個換行符,再進行第二次調用
4.cstring頭文件
每次
三、string類簡介
要使用string類,必須要程序中包含頭文件string(位於名稱空間std中)
string對象和字符數組的主要區別是,可以將string聲明為簡單變量,而不是數組
在很多方面,sting與使用字符組相同
- 可以使用C風格字符串來初始化string對象
- 可以使用cin來將鍵盤輸入到string對象中
- 可以使用cout來顯示string對象
- 可以使用數組表示法來訪問存儲在string對象中的字符
1.C++11字符串初始化
char first_name[] = {"ivan ivan ivan"}; char second_name[] {"clover clover"}; string third_name = {"awen awen awen"}; string fourth_name {"victor victor"};
2.賦值、拼接和附加
不能將一個數組賦給另一個數組,但可以將一個string對象賦給另一個string對象
char charr1[20]; //創建空數組 char charr2[20] = "ivankao"; //初始化數組 string str1; //創建空string對象 string str2 = "clover"; //初始化string對象 charr1 = charr2; //無效,不能將一個數組賦給另一個數組 str1 = str2; //有效
要使
sting類簡化了字符串合併的操作,使用 + 將sting對象合併, 使用 += 將字符串附加到 sting對象的末尾
string str3; str3 = str2 + str1; str1 += str2; //將str2附加到str1的末尾
3.string類其他操作
待續
留言列表