C++ 複合類型學習筆記

來源:互聯網
上載者:User

複合類型是基於整形和浮點型建立的。影響最為深遠的複合類型是類。

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--

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.