1. 程式人生 > >第四章 復合類型

第四章 復合類型

-1 規則 結構 隊列 c++ 算術運算 處理 基本 創建

數組、結構和指針是C++的三種符合類型

數組的初始化規則:

1. float hotelTips[5] = {5.0, 2.5}; //只初始化前兩個元素

2. long totals[500] = {1}; //第一個元素設為1,其它所有元素都初始化為0

3. short things[] = {1, 5, 3, 8}; //編譯器將使things數組包含4個元素

C-風格字符串:

以空字符結尾,空字符寫作‘\0‘

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     /*C風格的字符串以‘\0‘結尾*/
 6
char c1[3] = {O,h,!}; 7 cout << c1 << endl;//將顯示亂碼 8 char c2[4] = {O,h,!,\0}; 9 cout << c2 << endl;//正常顯示 10 11 system("pause"); 12 return 0; 13 }

cout對象在遇到‘\0’時截斷輸出。

用引號括起的字符串,隱式地包括空字符。

C++通過鍵盤輸入,將自動加上結尾的空字符。

字符串的拼接:

    /*拼接字符串*/
    char
s1[] = "i\‘m" " fine!"; cout << s1 << endl;

字符串間以空格隔開,第二個字符串緊跟在第一個後面,而不考慮第一個字符串結尾的‘\0’。

cin以空格來標記字符串的結束位置。

每次讀取一行字符串

istream中的類(如:cin)提供了一些面向行的類成員函數:getline()和get();而getline()將丟棄換行符,get()把換行符留在隊列中,作為下一個輸入的首字符

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace
std; 4 int main() 5 { 6 const int Size = 20; 7 char City[Size]; 8 char Name[Size]; 9 cout << "enter your city:\n"; 10 // cin.getline(City, Size); 11 cin.get(City, Size);//get()將換行符保留在輸入列隊裏,使得下一個get(Name, Size)直接讀入‘\n‘。 12 cin.get();//讀取下一個字符,這裏用來讀取換行符。這裏必須加個get()函數,以清空輸入隊列。 13 cout << "enter your name:\n"; 14 // cin.getline(Name, Size); 15 cin.get(Name, Size); 16 cout << "your city is " << City << " name is " << Name << endl; 17 int Sz = strlen(City);//統計顯示字符長度 18 cout << Sz << endl; 19 system("pause"); 20 return 0; 21 }

可以采用cin.get(City, Size).get()的寫法。

用cin >> 輸入也會將換行符留在隊列中。

讀取空行將設置失效位(failbit)?

string類:

string類在頭文件string中定義

string對象和字符數組之間的主要區別是:可以將string對象聲明為簡單變量,而不是數組,string類有自動調整大小的功能。

不能將一個數組賦值給另一個數組,當能將一個string對象賦值給另一個string對象。

可以使用‘+’將兩個string對象合並。

頭文件cstring中定義了處理字符數組的函數,strcpy、strcat、strlen(等同於string對象的size()類函數)等。

getline是istream的類方法,但是istream的設計考慮了諸如double, int等C++基本類型,而沒考慮string類型。因此沒有處理string類型的類方法。cin和cout能直接處理string對象,因為string對象的代碼使用了string類的一個友元函數。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     string str1;
 8     char str2[20];
 9     cout << "string object:\n";
10     cin.getline(str2, 20);
11     cout << "array:\n";
12     getline(cin, str1);
13     cout << str1 << "length:" << str1.size() << \n << str2 << "length:" << strlen(str2) << endl;
14     system("pause");
15     return 0;
16 }

枚舉

C++的enum工具提供了另一種創建符號常量的方法,這種方法可以替代const。

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

在不進行強制類型轉換時,智能將定義枚舉時使用的枚舉量賦值給枚舉變量(spectrum band)。

只為枚舉定義了賦值運算符,而沒定義算術運算符。

如果int值是有效的,可以通過強制類型轉換將它賦給枚舉變量(band = spectrum(3) )

可以使用賦值運算符來顯示地設置枚舉量的值。

枚舉值可以重復。

枚舉的取值範圍

通過強制類型轉換,可以將取值範圍內的任何整數值賦給枚舉變量。

上限:大於枚舉量的最大值的最小的2的冪次方的值減1。

下限:枚舉量的最小值大於等於0時,下限為0;小於0時,下限類比於上限取值,只不過為負。

指針

使用new動態分配內存:

int* pr = new int;
delete pr;

int* pq = new int [SIZE];
delete [] pq;

數組的替代品:

1. vector模板類,數據對象存儲在堆中。自動使用new和delete來管理內存,比數組功能強大但效率低下。

數組大小可定義為變量

#include<vector>
int SIZE;
cin >> SIZE;
vector<int> A(SIZE);

2. C++ 11新增array類,數據對象存儲在棧中,效率比vector高,但數組大小不能定義為變量。

#include<array>
array<int, 4> A;

註:C++11中,可將列表初始化用於vector和array對象,但c++98不允許對vector這麽做。

同時,vector和array對象還提供了成員函數at(),在運行期間捕獲非法索引(A.at(-1)將報錯)。

第四章 復合類型