ASP.NET 2.0網頁製作徹底研究

Download Report

Transcript ASP.NET 2.0網頁製作徹底研究

第11章 從C到C++語言






11-1
11-2
11-3
11-4
11-5
11-6
C++語言的基礎
C++語言的資料型態與運算子
C++語言的輸出與輸入
C++語言的動態記憶體配置
C++語言的參考變數和範圍運算子
C++語言的函數
11-1 C++語言的基礎



11-1-1 C++語言的歷史
11-1-2 第一個C++程式
11-1-3 ANSI-C++的標頭檔與名稱空間
11-1-1 C++語言的歷史


C++語言是在1980年初期,Bjarne Stoustrup
在AT&T貝爾實驗室著手開發的程式語言,最初的
名稱是「C with Classes」,在1983年定名為
C++,1985年10月Bjarne Stoustrup出版
「The C++ Programming Language,第一
版」一書,這就是C++語言第一個標準版本。
到了1990年,ANSI成立X3J16委員會制定標準
ANSI-C++,直到1997年11月才製定出標準的
ANSI-C++,在第二年建立最後版本的
ANSI/ISO標準C++。事實上,1989年製定C語
言的ANSI-C時,也參考C++語言的部分語法。
11-1-2 第一個C++程式-說明

C++程式架構類似C語言,程式碼副檔名
是.cpp(C語言是.c),換句話說,在整合
開發環境編譯程式後,儲存成.cpp副檔名,
就表示程式碼檔案是C++程式。
11-1-2 第一個C++程式-範例
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
/* 程式範例: Ch11_1_2.cpp */
#include <iostream>
#include <cstdlib>
// 主程式
int main() {
// 顯示訊息
std::cout << "第一個C++程式\n";
system("PAUSE");
return 0;
}
11-1-2 第一個C++程式-範例說明1

程式註解:第1列、第4列和第6列是程式註解,
C++語言除了支援C語言標準註解「/*」和「*/」
外,還新增「//」符號開始的文字列作為註解
(這也是C99支援的註解語法),如下所示:
04: // 主程式
05: int main() {
06: // 顯示訊息

標頭檔:第2~3列含括標頭檔<iostream>和
<cstdlib>,ANSI-C++標頭檔和C語言不同,
詳細說明請參閱下一節。<iostream>標頭檔是
C++語言標準輸出輸入串流的標頭檔。
11-1-2 第一個C++程式-範例說明2

主程式:第5~10列的main()函數是C++程式的
主程式,也就是執行時的進入點,換句話說,執
行C++程式就是從此函數開始,如下所示:
05: int main() {
06: // 顯示訊息
07: std::cout << "第一個C++程式\n";
08: system("PAUSE");
09: return 0;
10: }

main()主程式是C++語言的函數,在第9列傳回
0表示沒有錯誤,第7列使用std::cout和「<<」
輸出運算子來輸出文字內容,詳細說明請參閱第
11-3節。
11-1-3 ANSI-C++的標頭檔與名稱空
間-現代樣式標頭檔


在新版ANSI-C++支援「現代樣式標頭檔」
(Modern-Style Headers)和名稱空間
(Namespaces),可以使用全新方式來
含括標頭檔和使用C++語言的標準函式庫
(C++ Standard Library)。
在ANSI-C++標準函式庫提供現代樣式標
頭檔,新樣式的標頭檔不需.h副檔名,因
為它並不是指檔案名稱,而是一個識別字,
如下所示:
#include <iostream>
11-1-3 ANSI-C++的標頭檔與名稱空
間-ANSI-C++標頭檔1

C++標準函式庫常用的標頭檔說明,如下
表所示:
ANSI-C++標頭檔
<exception>、<stdexcept>
<fstream>
<iomanip>
<iostream>
<limits>
<string>
說明
例外處理的相關類別
C++檔案處理的相關函數
格式化串流資料的相關函數
基本輸出與輸入的相關函數
定義不同電腦系統數值資料型態的範圍
字串處理的類別
11-1-3 ANSI-C++的標頭檔與名稱空
間-ANSI-C++標頭檔2

對應常用ANSI-C標頭檔的ANSI-C++標
頭檔名稱,如下表所示:
ANSI-C++標頭檔
<cctype>
<climits>
<cmath>
<cstdio>
<cstdlib>
<cstring>
<ctime>
ANSI-C 標頭檔
<ctype.h>
<limits.h>
<math.h>
<stdio.h>
<stdlib.h>
<string.h>
<time.h>
11-1-3 ANSI-C++的標頭檔與名稱空
間-使用標準函數庫的名稱空間std1


C++標準函式庫定義的類別與函數屬於名
為std的名稱空間,而不是全域範圍。名稱
空間(Namespaces)是宣告一個區域範
圍,以便區域化名稱來避免名稱衝突的問
題。
換句話說,標準輸出類別cout的全名應該
加上名稱空間std::cout,如下所示:
std::cout << "第一個C++程式\n";
11-1-3 ANSI-C++的標頭檔與名稱空
間-使用標準函數庫的名稱空間std2

不過,為了和舊版C++程式相容,如下所示:
cout << "第一個C++程式\n";

上述程式碼並沒有使用std名稱空間,此時,我們
需要在程式開頭指定使用std名稱空間,如下所示:
#include <iostream>
using namespace std;

上述using namespace指引指令使用名稱空間
std,表示將std視為全域範圍,此時,就不需要
在cout前加上std::。
11-2 C++語言的資料型態與運算子


11-2-1 C++語言新增的資料型態
11-2-2 C++語言的運算子
11-2-1 C++語言新增的資料型態-說
明

C++語言支援C語言的所有資料型態,在
ANSI-C++還新增bool和wchar_t資料型
態,如下表所示:
資料型態 位元組
bool
1
wchar_t
2
說明
布林值,只有 2 種值 true 或 false
寬字元,用來儲存兩位元組的字元
11-2-1 C++語言新增的資料型態-資
料型態wchar_t(說明)

資料型態wchar_t宣告的變數是用來儲存
寬字元,在指定變數值時,字元前需要加
上「L」符號來表示是寬字元,如下所示:
wchar_t ch = L'a';

上述程式碼指定變數ch值是寬字元'a',事
實上,它的值和char型態並沒有不同,因
為ANSI字碼的前255字元和Unicode是相
同的。不只如此,「L」符號也可以用來表
示wchar_t的Unicode字串,如下所示:
wchar_t* str = L"Unicode String";
11-2-1 C++語言新增的資料型態-資
料型態wchar_t(Unicode)

「統一字碼」(Unicode)是由Unicode
Consortium組織所制定的一個能包括全世
界文字的字碼集,它包含GB2312和Big5
字碼集的所有字集,即ISO 10646字集,
它有常用的兩種編碼方式:UTF-8為8位元
編碼,UTF-16為16位元的編碼。
11-2-1 C++語言新增的資料型態C++語言的變數宣告與初值


C++語言不同於C語言只能在程式區塊的
開始宣告變數,C++語言允許在程式碼的
任何位置,有需要時即可宣告變數。
在宣告變數後,指定初始變數值的方法,
除了使用指定敘述,也可以在括號中指定
初值,其語法如下所示:
資料型態 變數名稱 (初值);

程式碼是在宣告變數時,指定其初值,例
如:宣告整數a,如下所示:
int a (10);
int b = 20;
11-2-2 C++語言的運算子-關係運算
子

C++語言因為支援布林資料型態bool,所以關係
運算式的結果是布林值的變數,而不是整數,其
值只能是true或false。例如:一些關係運算式的
結果,如下所示:
r1 = ((5 == 5) && (3 > 6)); // false(true && false)
r2 = ((5 == 5) || (3 > 6)); // true(true || false)

上述變數r1和r2是bool布林資料型態,其值分別
為false和true,實際值仍然是整數值是0和1。
11-2-2 C++語言的運算子-C++的型
態迫換

C++語言除了相容C語言的型態迫換方式
外,也可以使用新語法,也就是將迫換變
數置於型態的括號中,首先是C語言方式,
如下所示:
int i;
float f = 3.1415;
i = (int) f;

程式碼將浮點變數f迫換成整數,變數i的值
為整數3。C++還可以將變數置於括號中
進行型態迫換,如下所示:
i = int (f);
11-2-2 C++語言的運算子-型態迫換
運算子
在ANSI-C++定義四種:reinterpret_cast、
static_cast、dynamic_cast和const_cast型態
迫換運算子,這些運算子主要是使用在類別的型
態轉換。其中static_cast運算子也可以使用在基
本資料型態的轉換,其語法如下所示:
static_cast<基本資料型態>(運算式);
 例如:將double浮點數型態迫換成int整數,如下
所示:
double pi = 3.14159265;
int j = static_cast<int>(pi);

11-3 C++語言的輸出與輸入


11-3-1 標準輸出串流的cout物件
11-3-2 標準輸入串流的cin物件
11-3 C++語言的輸出與輸入

C++語言提供全新標準輸出與輸入串流
(Streams)來取代C語言的標準輸出和輸入函
數scanf()和printf(),在<iostream>標頭檔定
義兩種標準串流,如下所示:
• cin:標準輸入串流。
• cout:標準輸出串流。

C++語言的cin和cout串流物件的字頭為「c」字
元,表示是「控制台」(Console),in/out表
示輸入與輸出。在C++程式含括<iostream>標
頭檔,就可以使用cin和cout物件來輸入和輸出資
料。
11-3-1 標準輸出串流的cout物件-說
明
在C++程式只需將顯示字串、運算式或變數送到
標準輸出cout,就可以在螢幕上顯示所需的資料,
其功能如同簡化的printf()函數,如下所示:
cout << str;
 「<<」串流插入運算子(Stream Insertion
Operator)表示串流輸出的方向。
 cout運算子還可以重複使用「<<」運算子在同
一列程式碼執行多次輸出,如下所示:
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "a + b = " << a + b << endl;

11-3-1 標準輸出串流的cout物件-成
員函數put()

串流物件cout物件提供多種成員函數可以
輸出資料,例如:成員函數put()可以輸出
單一字元至螢幕顯示,如下所示:
cout.put('a');
cout.put('b').put('c');
11-3-1 標準輸出串流的cout物件-成
員函數write()

串流物件cout物件的write()成員函數可以
輸出指定長度的字元陣列,如下所示:
char *str = "陳會安\n";
cout.write(str, 2);
cout.write(str, strlen(str));
11-3-2 標準輸入串流的cin物件-說明
C++語言處理標準輸入是cin物件,它是與cout
物件相反的操作,我們可以使用cin輸入串流來輸
入資料,如下所示:
char name[MAXSIZE];
cin >> name;
 「>>」串流讀取運算子(Stream Extraction
Operator)送至變數,即存入字串變數name,
在功能上如同scanf("%s")函數。
 標準輸入串流的cin物件也可以輸入數值資料,例
如:int整數,如下所示:
int age;
cin >> age;

11-3-2 標準輸入串流的cin物件-成員
函數getline()
串流物件cin提供成員函數getline(),可以取得
一整行包含空白字元的文字內容,宣告如下:
cin.getline(char buffer[], int length, char
delimiter = '\n');
 參數buffer儲存輸入文字內容的字元陣列,
length參數是陣列長度,參數delimiter判斷輸入
結束,預設參數值是新行字元'\n',即讀取到新行
字元為止,如下所示:
char buffer[MAXSIZE];
cin.getline(buffer, MAXSIZE);

11-4 C++語言的動態記憶體配置-說
明

在C++語言雖然也可以使用C語言動態記
憶體配置的malloc()和free()函數,不過,
C++語言可以使用新增的new和delete運
算子來配置和釋放記憶體空間。
11-4 C++語言的動態記憶體配置new運算子1
在C++程式可以使用new運算子配置指定型態的
記憶體空間,其語法如下所示:
指標變數 = new 資料型態;
指標變數 = new 資料型態[ 元素數 ];
 new運算子有2種使用方式,第一種是配置單一
資料型態的記憶體空間,可以傳回相同型態的指
標,如下所示:
int *ptr2;
ptr2 = new int;
 程式碼配置整數int,ptr2是整數的指標變數。

11-4 C++語言的動態記憶體配置new運算子2
配置結構Time的記憶體空間,如下所示:
Time *now;
now = new Time;

第二種情況是當程式需要多個相同資料型態的記
憶體空間時,例如:陣列,在C++程式是使用
類似陣列宣告方式來指定配置的元素數,如下所
示:
char *str;
str = new char[50];

程式碼配置50個字元型態char的記憶體空間。

11-4 C++語言的動態記憶體配置delete運算子
在C++程式使用new運算子配置的記憶體空間,
可以使用delete運算子釋放指定型態的記憶體空
間,其語法如下所示:
delete 資料型態;
delete[] 資料型態;
 delete運算子也有2種使用方式,第一種是釋放
配置單一元素型態的記憶體空間,如下所示:
delete ptr2;
delete now;
delete[] str;

11-5 C++語言的參考變數和範圍運
算子-參考變數Reference
參考變數是其他變數的別名,在宣告參考
變數時,需要指定成其他變數的名稱。參
考變數的宣告和指標變數的宣告相似,其
宣告語法如下所示:
資料型態 &變數名稱;
 宣告和指標變數宣告的差異只在變數名稱
前的「*」號改為「&」符號(即取址運算
子)。例如:宣告其他整數變數num別名
的參考變數ref,如下所示:
int &ref = num;

11-5 C++語言的參考變數和範圍運
算子-範圍運算子

在函數中如果擁有與全域變數同名的區域
變數,C語言的函數只能存取區域變數,並
無法存取全域變數。C++語言提供「::」
範圍運算子可以存取全域變數的值,如下
所示:
::value = int(value) + 7;
11-6 C++語言的函數




11-6-1
11-6-2
11-6-3
11-6-4
函數過載
inline函數
參考變數的傳址呼叫
預設的參數值與空參數列
11-6-1 函數過載
C++函數允許擁有兩個以上同名函數,只需函數
傳遞的參數個數或資料型態不同即可,這些同名
的函數稱為「過載」(Overload),如下所示:
int square(int);
double square(double);
 兩個同名函數的原型宣告是參數型態不同。接著
是參數個數不同的函數範例,如下所示:
int getMax(int, int);
int getMax(int , int, int);

11-6-2 inline函數


C++語言的inline函數主要是針對一些小
型且需要頻繁呼叫的函數,因為inline函數
是直接在函數呼叫的程式列展開函數的程
式碼,以便節省呼叫函數所花費的額外執
行時間,可以加速程式的執行。
在C++程式建立inline函數只需在函數前
加上inline關鍵字,如下所示:
inline int square(int no) { return no*no; }
11-6-3 參考變數的傳址呼叫-說明
C語言的函數只支援傳值呼叫,函數的傳址呼叫
是透過指標來處理。C++語言可以使用指標(和
C語言相同)或參考變數來建立函數的傳址呼叫,
雖然寫法不同,但是功能完全相同。參考變數的
函數原型宣告,如下所示:
void swap(int &, int &);
void swap(int &x, int &y);
 兩種函數原型宣告都可以使用,在參數列可以只
列出型態,也可以連參數名稱也一併列出,這2個
參數x和y都是參考變數。

11-6-3 參考變數的傳址呼叫-範例

如果函數使用參考變數來傳遞,在函數中
的程式碼就可以直接更改其參考的變數值,
也就是呼叫時傳入的變數值。函數swap()
的完整程式碼,如下所示:
void swap(int &x, int &y) {
int temp;
temp = x;
x = y;
y = temp;
}
11-6-4 預設的參數值與空參數列
在C++函數可以指定預設參數值,換句話
說,如果函數在呼叫時,沒有指定參數值,
就可以使用預設參數值。例如:預設參數
值volume()函數的原型宣告,如下所示:
int volume(int, int = 2, int = 3);
int volume(int length, int width = 2,
int height = 3);
