第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
12-1 C++語言的基礎 12-1-1 C++語言的歷史 12-1-2 第一個C++程式 12-1-3 C++語言的布林資料型態
12-1-1 C++語言的歷史-說明 C++語言是在1980年初期,Bjarne Stoustrup在AT&T貝爾實驗室著手開發的程式語言,在1983年定名為C++,1985年10月Bjarne Stoustrup出版「The C++ Programming Language,第一版」一書,這就是C++語言的標準版本。 到了1990年,ANSI成立X3J16委員會制定標準的ANSI-C++,直到1997年11月才製定完成標準的ANSI-C++,事實上,1989年製定C語言的ANSI-C時,也曾參考C++語言的部分語法。
12-1-1 C++語言的歷史-C與C++ C++語言是將C語言擴充成一種物件導向的程式語言,其最初的目的是建立更有效率的C語言,C++語言可以視為程序式程式語言,只是新增物件導向的功能和一些改進程序式程式語言的語法。 使用C++語言撰寫的程式可以使用傳統程序式程式設計(即C語言的寫法),也可以使用物件導向程式設計風格。
12-1-2 第一個C++程式-說明 C++程式架構類似C語言,在Dev-C++新增原始碼檔案後,只需編輯好程式碼將它儲存成副檔名.cpp(C語言是.c),如此的程式碼檔案即是C++程式。
12-1-2 第一個C++程式-步驟1 步驟1:建立C++程式和編輯程式內容 Dev-C++一樣可以編輯、編譯和執行C++應用程式。
12-1-2 第一個C++程式-步驟2 步驟2:編譯和執行C++應用程式 請執行「執行」→「編譯並執行」指令或按F9鍵,如果程式沒有錯誤,可以看到執行結果,在「命令提示字元」視窗顯示字串內容,如下圖所示:
12-1-2 第一個C++程式-架構 C++語言的程式架構和C語言相同,都是由含括標頭檔、函數和全域變數宣告、main()主程式和其它函數所組成,如下所示: 01: /* 程式範例: Ch12-1-2.cpp */ 02: #include <iostream.h> 03: #include <stdlib.h> 04: // 主程式 05: int main() 06: { 07: // 顯示訊息 08: cout << "第一個C++程式\n"; 09: system("PAUSE"); 10: return 0; 11: }
12-1-2 第一個C++程式-程式註解 程式註解:第1和7列是程式註解,C++除支援C語言的標準註解「/*」和「*/」外,還新增「//」符號開始的文字列作為註解(這也是C99支援的註解),如下所示: 07: // 顯示訊息
12-1-2 第一個C++程式-標頭檔 標頭檔:第2~3列含括標題檔,<iostream.h>標頭檔是C++語言基本輸出輸入串流的標頭檔。
12-1-2 第一個C++程式-主程式 主程式:第5~11列的main()函數是C++程式的主程式,這是C++應用程式執行時的進入點,也就是說執行C++程式是從此函數開始,如下所示: 05: int main() 06: { 07: // 顯示訊息 08: cout << "第一個C++程式\n"; 09: system("PAUSE"); 10: return 0; 11: }
12-1-3 C++語言的布林資料型態-bool布林資料型態 C++語言支援C語言所有的資料型態,在ANSI-C++還支援bool布林資料型態,如下表所示: bool type = true;
12-1-3 C++語言的布林資料型態-變數宣告與初值 C++語言不同於C語言只能在程式區塊的開始宣告變數,C++語言允許在程式碼的任何位置,只要需要使用變數即可宣告變數,在宣告變數後,指定初始變數值的方法,除了使用指定敘述,也可以在括號中指定初值,其語法如下: 資料型態 變數名稱 (初值); 上述程式碼是在宣告變數時,指定其初值,例如:宣告整數a,如下所示: int a (10); int b = 20;
12-1-4 C++語言的運算子-關係運算子(Relational Operators) C++語言支援布林資料型態bool,所以關係運算式的結果是布林值的變數,而不在是整數,其值只能是true或false(Dev-C++的GCC的實際值仍為1和0),例如:一些關係運算式的結果,如下所示: r1 = ((5 == 5) && (3 > 6)); // false(true && false) r2 = ((5 == 5) || (3 > 6)); // true(true || false) 變數r1和r2是bool布林資料型態,其值分別為false和true,實際值是整數值是0和1。
12-1-4 C++語言的運算子-型態迫換(Type Casting Operators) C++語言除了相容C語言的型態迫換方式外,也可以使用新語法,也就是將迫換的變數置於型態的括號中,首先是C語言方式,如下所示: int i; float f = 3.1415; i = (int) f; 上述程式碼將浮點變數f迫換成整數,變數i的值為整數3。C++還可以將變數置於括號中進行型態迫換,如下所示: i = int (f);
12-2 C++語言的輸出與輸入 12-2-1 C++語言的輸出與輸入 12-2-2 輸入一整行文字內容
12-2 C++語言的輸出與輸入 C++語言提供全新標準輸出與輸入串流(Streams)來取代C語言的標準輸出和輸入函數scanf()和printf(),在<iostream.h>標頭檔的C++函式庫支援2種資料串流,如下所示: cin:標準輸入串流。 cout:標準輸出串流。
12-2-1 C++語言的輸出與輸入-說明 C++語言的cin和cout運算子的字頭為「c」字元,表示這是「控制台」(Console),in/out表示輸入與輸出。 在C++程式只需含括<iostream.h>標頭檔,就可以使用cin和cout運算子輸入和輸出資料,如下所示: #include <iostream.h>
12-2-1 C++語言的輸出與輸入-cout運算子 C++程式只需將顯示字串或變數送到標準輸出cout運算子,就可以在螢幕上顯示,其功能如同簡化的printf()函數,如下: cout << "請輸入字串內容: "; cout運算子還可以重複使用「<<」運算子在同一列程式碼輸出多個字串,如下所示: cout << "字串內容:[" << string << "]長度為:" << count << "\n";
12-2-1 C++語言的輸出與輸入-cin運算子 cout運算子的相反操作是輸入資料,此時是使用的是cin運算子的輸入串流,如下所示: cin >> string; 程式碼從標準輸入讀取字串,串流方向是從標準輸入使用「>>」運算子送到變數,最後存入字串變數string,在功能上如同scanf("%s")函數。
12-2-2 輸入一整行文字內容 cin是一個串流物件,提供成員函數getline()可以取得一整行的文字內容,其原型宣告,如下所示: cin.getline(char buffer[], int length, char delimiter = ' \n'); 函數屬於cin物件的成員函數,使用「.」運算式呼叫,參數buffer是用來儲存輸入文字內容的字元陣列,length參數是讀取的最大字元數,也就是陣列長度,最後一個參數delimiter是判斷輸入結束,預設的參數值是新行字元'\n',即讀取到新行字元為止。
12-3 C++語言的動態記憶體配置-new運算子 ptr2 = new int; today = new date;
12-3 C++語言的動態記憶體配置-delete運算子 在C++程式使用new運算子配置的記憶體空間,可以使用delete運算子釋放指定型態的記憶體空間,其語法如下所示: delete 資料型態; delete[] 資料型態; new運算子的使用有2種方式,第一種是釋放配置單一元素型態的記憶體空間,第二種方式是釋放配置陣列的多個元素。
12-4 C++語言的參考變數和範圍運算子-參考變數Reference 參考變數是其它變數的別名,在宣告參考變數時,需要指定成其它變數的名稱,參考變數的宣告和指標變數的宣告相似,其宣告的語法格式,如下所示: 資料型態 &變數名稱; 宣告和指標變數宣告只是將變數名稱前的「*」號改為「&」符號(這就是取址運算子)。
12-4 C++語言的參考變數和範圍運算子-參考變數範例 整數變數別名的參考變數宣告,如下所示: int &ref = num; 程式碼宣告參考變數ref變數num,也就是num的別名,ref參考變數就是變數num,當指定變數ref的值,相當於是指定變數num的值,如下: num = 15; ref = 17; 指定敘述分別指定num = ref = 15和ref = num = 17,換句話說,變數num和ref位址屬性的記憶體位址是指同一個位址。
12-4 C++語言的參考變數和範圍運算子-範圍運算子(Scope Operators) 如果函數中擁有同名的區域和全域變數,在C語言的函數並無法存取全域變數,因為存取的是同名的區域變數,C++語言提供「::」運算子可以存取全域變數的值,如下所示: ::value = int(value) + 7; 程式碼的2個value變數,value是取得區域變數的值,::value是指定全域變數value的值。
12-5 C++語言的函數 12-5-1 函數過載 12-5-2 inline函數 12-5-3 參考變數的傳址呼叫 12-5-4 預設的參數值
12-5-1 函數過載 C++語言的函數允許擁有兩個以上同名的函數,只是函數傳遞的參數個數或資料型態不同,稱為「過載」(Overload),如下所示: int square(int); double square(double); 兩個同名函數的原型宣告只是參數的型態不同。接著是參數個數不同的函數範例,如下所示: int getMax(int, int); int getMax(int , int, int); 同名函數的參數個數為2和3。
12-5-2 inline函數 C++語言的inline函數主要針對一些小型且頻繁呼叫的函數,因為inline函數是直接在函數呼叫的程式列展開函數的程式碼,以便節省呼叫函數所花費的額外執行時間,加速程式的執行。 在C++程式建立inline函數只需在函數前加上inline關鍵字,如下所示: inline int square(int no) { return no*no; }
12-5-3 參考變數的傳址呼叫-說明 參考變數的函數原型宣告,如下所示: void swap(int &, int &); void swap(int &x, int &y); 上述2種函數原型宣告都可以,參數列可以只列出型態,也可以連參數名稱一併列出,這2個參數x和y都是參考變數,如果函數使用參考變數傳遞,在函數中的程式碼就可以直接更改其參考的變數值,也就是呼叫時傳入的變數值。
12-5-3 參考變數的傳址呼叫-函數 函數swap()的完整程式碼,如下所示: void swap(int &x, int &y) { int temp; temp = x; x = y; y = temp; }
12-5-4 預設的參數值 在C++的函數可以指定預設的參數值,換句話說,如果函數呼叫時沒有指定參數值,就是使用預設參數值,例如:預設參數值的函數呼叫,如下所示: int volume(int, int = 2, int = 3); int volume(int length, int width = 2, int height = 3);