![C面向對象程序設計_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/3/2a590a22-af55-4be5-8aff-43f3436aa9a8/2a590a22-af55-4be5-8aff-43f3436aa9a81.gif)
![C面向對象程序設計_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/3/2a590a22-af55-4be5-8aff-43f3436aa9a8/2a590a22-af55-4be5-8aff-43f3436aa9a82.gif)
![C面向對象程序設計_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/3/2a590a22-af55-4be5-8aff-43f3436aa9a8/2a590a22-af55-4be5-8aff-43f3436aa9a83.gif)
![C面向對象程序設計_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/3/2a590a22-af55-4be5-8aff-43f3436aa9a8/2a590a22-af55-4be5-8aff-43f3436aa9a84.gif)
![C面向對象程序設計_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/3/2a590a22-af55-4be5-8aff-43f3436aa9a8/2a590a22-af55-4be5-8aff-43f3436aa9a85.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2021-11-3南京中醫(yī)藥大學信息技術學院1信息技術學院信息技術學院 張蕾張蕾c+面向對象程序設計面向對象程序設計2021-11-3南京中醫(yī)藥大學信息技術學院2 課時:課時:7272(3333理論理論6 6指導性自學指導性自學3333實驗)實驗) 所授章節(jié):所授章節(jié):1-81-8 主講教師:主講教師:張蕾(張蕾() 時間分配:時間分配:理論(第理論(第1 1周周一周周一1313節(jié)、節(jié)、 112112周周三周周三1313節(jié))節(jié))實驗(實驗(212212周周一周周一1313節(jié))節(jié)) 實驗機房:實驗機房:b6305b63052021-11-3南京中醫(yī)藥大學信息技術學院3第一章第一章 c+的初步知識
2、的初步知識 第二章第二章 類和對象類和對象 第三章第三章 關于類和對象的進一步討論關于類和對象的進一步討論第四章第四章 運算符重載運算符重載 第五章第五章 繼承與派生繼承與派生 第六章第六章 多態(tài)性與虛函數多態(tài)性與虛函數 第七章第七章 輸入輸出流輸入輸出流 結束放映結束放映2021-11-3南京中醫(yī)藥大學信息技術學院4第一章第一章 c+的初步知識的初步知識 1.1 從從c到到c+ 1.2 c+語言的詞法和詞法規(guī)則語言的詞法和詞法規(guī)則 1.3 最簡單的最簡單的c+程序程序 1.4 c+對對c的擴充的擴充 1.5 c+程序的編寫和實現(xiàn)程序的編寫和實現(xiàn)2021-11-3南京中醫(yī)藥大學信息技術學院51
3、.1 從從c到到c+c語言是結構化和模塊化的語言,語言是結構化和模塊化的語言,c程序的設計程序的設計者必須細致地設計程序中的每個細節(jié),準確地考慮者必須細致地設計程序中的每個細節(jié),準確地考慮程序運行時每一時刻發(fā)生的事情,當程序規(guī)模變大程序運行時每一時刻發(fā)生的事情,當程序規(guī)模變大時,結構化程序設計就顯得力不從心。時,結構化程序設計就顯得力不從心。 為了解決軟件設計危機,在為了解決軟件設計危機,在20世紀世紀80年代提出年代提出了面向對象的程序設計思想(了面向對象的程序設計思想(oop)在實踐中人們)在實踐中人們發(fā)現(xiàn)發(fā)現(xiàn)c語言使用如此廣泛,如果在它的基礎上發(fā)展語言使用如此廣泛,如果在它的基礎上發(fā)展一
4、種面向對象的語言,一定會讓大眾容易接收這種一種面向對象的語言,一定會讓大眾容易接收這種語言,所以產生了語言,所以產生了c+。2021-11-3南京中醫(yī)藥大學信息技術學院6 at&t發(fā)布的第一個發(fā)布的第一個c+編譯系統(tǒng)是一個預編譯器,編譯系統(tǒng)是一個預編譯器,它把它把c+代碼轉換成代碼轉換成c代碼,然后再用代碼,然后再用c編譯系統(tǒng)編譯系統(tǒng)生成目標代碼。生成目標代碼。 1988年年 產生第一個產生第一個c+編譯系統(tǒng)編譯系統(tǒng) 1989年年 c+2.0 增加類的多重繼承增加類的多重繼承 1991年年 c+3.0 增加類的模板增加類的模板 c+4.0 增加異常處理、命名空間增加異常處理、命名空間
5、1997年年 ansi發(fā)布發(fā)布c+標準標準2021-11-3南京中醫(yī)藥大學信息技術學院7c+既可以用于既可以用于面向過程面向過程的結構化程序設計,也的結構化程序設計,也可用于可用于面向對象面向對象的程序設計。的程序設計。c+對對c的增強體現(xiàn)在兩個方面:的增強體現(xiàn)在兩個方面:1.對原來的面向過程機制做了擴充。對原來的面向過程機制做了擴充。2.增加了面向對象的機制。增加了面向對象的機制。學習學習c+之后,既可以進行面向對象的程序設計,之后,既可以進行面向對象的程序設計,也可以進行面向過程的程序設計。也可以進行面向過程的程序設計。2021-11-3南京中醫(yī)藥大學信息技術學院81.2 c+語言的詞法和
6、詞法規(guī)則語言的詞法和詞法規(guī)則c+語言的字符集語言的字符集 等同于等同于c語言的字符集,包括:(語言的字符集,包括:(1)大小寫英)大小寫英文字母(文字母(2)數字字符()數字字符(3)其他)其他ascii碼字符碼字符(除除、$外外) 。單詞及詞法規(guī)則單詞及詞法規(guī)則 單詞是構成語句的關鍵成份之一,通常由若干單詞是構成語句的關鍵成份之一,通常由若干字符組成,字符組成,c+有幾種單詞:有幾種單詞:1.關鍵字關鍵字 2.標識符標識符 3.運算符運算符 4.分隔符分隔符 5.注釋符。注釋符。2021-11-3南京中醫(yī)藥大學信息技術學院9關鍵字關鍵字 是是c+語言中的命令字,它是預定義好的單詞,語言中的命
7、令字,它是預定義好的單詞,c+編譯程序對其有專門的解釋。編譯程序對其有專門的解釋。 如如int、float、if、else、while、switch等等。等等。標識符標識符 程序員用標識符對程序中元素實施命名,包括函數名、程序員用標識符對程序中元素實施命名,包括函數名、類名、對象名、類型名、變量名、常變量名、數組名等。類名、對象名、類型名、變量名、常變量名、數組名等。 標識符以字母或下劃線開始,后跟字母、數字、下劃標識符以字母或下劃線開始,后跟字母、數字、下劃線,線,標識符區(qū)分大小寫字母標識符區(qū)分大小寫字母。2021-11-3南京中醫(yī)藥大學信息技術學院10運算符運算符 運算符代表某種操作的單詞
8、,由一個或多個字運算符代表某種操作的單詞,由一個或多個字符組成。符組成。 注意運算符的優(yōu)先級和結合順序。參考本書附注意運算符的優(yōu)先級和結合順序。參考本書附錄錄b(p287)。)。分隔符分隔符 在語句中關鍵字和標識符之間、各個語句之間在語句中關鍵字和標識符之間、各個語句之間要用分隔符分開。要用分隔符分開。c+常用的分隔符有空格、逗常用的分隔符有空格、逗號、分號、冒號、大括號。號、分號、冒號、大括號。2021-11-3南京中醫(yī)藥大學信息技術學院11注釋符注釋符c+提供了兩種注釋符。提供了兩種注釋符。/ * 注釋注釋* / 注釋注釋2021-11-3南京中醫(yī)藥大學信息技術學院121.3 最簡單的最簡
9、單的c+程序程序 例例1.1輸出一行字符輸出一行字符“this is a c+ program.”。#include / 用用cout輸出時需要用輸出時需要用 / 此頭文件此頭文件using namespace std; / 使用命名空間使用命名空間stdint main() coutthis is a c+ program.n; / 上面用上面用c+的方法輸出一行的方法輸出一行 return 0;2021-11-3南京中醫(yī)藥大學信息技術學院13(1)標準標準c+規(guī)定規(guī)定main函數必須聲明為函數必須聲明為int類型,類型,如果程序正常運行,向操作系統(tǒng)返回一個零值,如果程序正常運行,向操作系統(tǒng)
10、返回一個零值,否則返回非零值,通常是否則返回非零值,通常是-1。(2)c+程序中可以用程序中可以用/*/做注釋,可以用做注釋,可以用/做注做注釋。前者可以做多行注釋,后者只做單行注釋。釋。前者可以做多行注釋,后者只做單行注釋。(3)c+程序中常用程序中常用cout、cin進行輸出輸入,進行輸出輸入,cout是是c+定義的定義的輸出流對象輸出流對象,是是插入運算符插入運算符。2021-11-3南京中醫(yī)藥大學信息技術學院14 (4)使用使用cout、cin需要用頭文件需要用頭文件iostream,在程,在程序開始要用序開始要用#include聲明包含的頭文件。聲明包含的頭文件。 (5) using
11、 namespace std; 意思是使用命名空間。意思是使用命名空間。c+標準庫中的類和函數是在命名空間標準庫中的類和函數是在命名空間std中聲明中聲明的,因此程序中如用的,因此程序中如用c+標準庫中的有關內容標準庫中的有關內容(此時需要用(此時需要用#include命令行),就要用命令行),就要用using namespace std; 語句聲明。語句聲明。2021-11-3南京中醫(yī)藥大學信息技術學院15例例1.2 求求a和和b 兩個數之和兩個數之和 / 求兩數之和求兩數之和 #include / 預處理命令 using namespace std; / 使用命名空間std int mai
12、n() / 主函數首部 / 函數體開始 int a,b,sum; / 定義變量 cinab; / 輸入語句 sum=a+b; / 賦值語句 couta+b=sum”是是提取運算提取運算符符,與,與cin配合,其作用是從輸入設備中提取數據配合,其作用是從輸入設備中提取數據送到輸入流送到輸入流cin中。在程序執(zhí)行時,鍵盤輸入的第中。在程序執(zhí)行時,鍵盤輸入的第一個數據賦予一個數據賦予a,第二個數據賦予,第二個數據賦予b 。 cout語句中的語句中的endl是是c+控制符常數,作用是讓控制符常數,作用是讓光標換行。光標換行。 如果在本程序運行時輸入:如果在本程序運行時輸入: 123 456 程序則輸出
13、:程序則輸出: a+b = 5792021-11-3南京中醫(yī)藥大學信息技術學院17 例例1.3 求兩個數中的大數求兩個數中的大數 #include using namespace std; int main() int max(int x,int y) ; /對max函數作聲明 int a,b,c; cinab; c=max(a,b); /調用max函數 coutmax=cy) z=x; else z=y; return (z); 2021-11-3南京中醫(yī)藥大學信息技術學院19 本程序包含兩個函數:本程序包含兩個函數:主函數主函數main和和被調用的函數被調用的函數maxmax函數的作用是將
14、兩個整數中的大數賦予函數的作用是將兩個整數中的大數賦予變量變量z。return語句將語句將z的值返回給主函數的值返回給主函數main。返回值是通過函數名返回值是通過函數名max帶回到帶回到main函數的調用函數的調用處。處。 程序運行情況如下:程序運行情況如下: 18 25 (輸入輸入18和和25) max = 25 (輸出最大值輸出最大值25)2021-11-3南京中醫(yī)藥大學信息技術學院20 例例1.3 程序的另一種格式程序的另一種格式 #include using namespace std; int main() int max(int x,int y) /定義max函數 int z;
15、if(xy) z=x; else z=y; return (z); int a,b,c; cinab; c=max(a,b); /調用max函數 coutmax=cendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院21例例1.4包含類的包含類的c+程序程序#include using namespace std;class student / 聲明一個類,類名為student private: / 以下為類中的私有部分 int num; / 私有變量num int score; / 私有變量score public: / 以下為類中公用部分 void setdata(
16、) / 定義公用函數setdata cinnum; / 輸入num的值 cinscore; / 輸入score的值 void display() / 定義公用函數display coutnum=numendl; / 輸出num的值 coutscore=scoreendl; ; / 輸出score的值; / 類的聲明結束2021-11-3南京中醫(yī)藥大學信息技術學院22 student stud1,stud2; /定義stud1和stud2為student類的變量,稱為對象 int main() / 主函數首部 stud1.setdata(); / 調用對象stud1的setdata函數 stud
17、2.setdata(); / 調用對象stud2的setdata函數 stud1.display(); / 調用對象stud1的display函數 stud2.display(); / 調用對象stud1的display函數 return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院23 程序中聲明一個被稱為程序中聲明一個被稱為類類的類型的類型student。聲明。聲明時要用關鍵字時要用關鍵字class。c+類中可以包含兩種成員類中可以包含兩種成員即數據即數據(如變量如變量num、 score)和函數和函數(如如setdata函函數和數和 display函數函數)。分別稱為。分別稱為數據
18、成員數據成員和和成員函成員函數數。 在在c+ 中將一組數據和訪問這組數據的函數封裝中將一組數據和訪問這組數據的函數封裝在一起,組成類。一個類是由一組數據,一組對在一起,組成類。一個類是由一組數據,一組對其訪問的若干函數,以及數據和函數的訪問屬性其訪問的若干函數,以及數據和函數的訪問屬性組成的。在前面程序中看到的組成的。在前面程序中看到的private (私有)(私有) public(公有)保留字代表數據和函數的訪問屬(公有)保留字代表數據和函數的訪問屬性。性。2021-11-3南京中醫(yī)藥大學信息技術學院24 凡是指定為公有的數據和函數,既可由本類的函凡是指定為公有的數據和函數,既可由本類的函數
19、訪問和調用,也可由其他函數或語句訪問和調數訪問和調用,也可由其他函數或語句訪問和調用;凡是指定為私有的數據和函數,通常只能由用;凡是指定為私有的數據和函數,通常只能由本類的函數訪問和調用。本類的函數訪問和調用。 程序中程序中“student stud1,stud2; ”是一個定義語是一個定義語句,定義兩個句,定義兩個student 類型變量類型變量stud1和和stud2, student 類與類與int一樣是一樣是c+的合法類型。的合法類型。2021-11-3南京中醫(yī)藥大學信息技術學院25 具有類類型的變量稱為具有類類型的變量稱為對象對象。 student的對象的對象stud1,stud2具
20、有同樣的結構和特征。具有同樣的結構和特征。 在類外調用成員函數時必須在函數名前冠以類的在類外調用成員函數時必須在函數名前冠以類的名稱。名稱。 2021-11-3南京中醫(yī)藥大學信息技術學院26 主函數中第一條語句輸入學生主函數中第一條語句輸入學生1的學號和成績,第二條語的學號和成績,第二條語句輸入學生句輸入學生2的學號和成績,第三條語句輸出學生的學號和成績,第三條語句輸出學生1的學號的學號和成績,第四條語句輸出學生和成績,第四條語句輸出學生2的學號和成績。程序運行的學號和成績。程序運行情況如下:情況如下: 1001 98.5 1002 76.5 num=1001 score=98.5 num=1
21、002 score=76.52021-11-3南京中醫(yī)藥大學信息技術學院27 為了與為了與c兼容,兼容, c+保留了保留了c語言中的一些規(guī)定,語言中的一些規(guī)定,例如頭文件的文件名,以例如頭文件的文件名,以c語言里頭文件的擴展語言里頭文件的擴展名是名是 .h,許多,許多c+編譯系統(tǒng)保留了這種擴展名,編譯系統(tǒng)保留了這種擴展名,近年推出的近年推出的c+編譯系統(tǒng)新版本,推出了一批不編譯系統(tǒng)新版本,推出了一批不帶擴展名的頭文件如帶擴展名的頭文件如iostream,string ,cmath 等。為了兼容等。為了兼容c+仍允許使用帶擴展名的頭文件。仍允許使用帶擴展名的頭文件。由于由于c語言無命名空間,因此
22、使用帶擴展名的頭語言無命名空間,因此使用帶擴展名的頭文件時不用文件時不用using namespace std。2021-11-3南京中醫(yī)藥大學信息技術學院281.4 c+對c的擴充 c+既可用于面向過程的程序設計,也可既可用于面向過程的程序設計,也可用于面向對象程序設計。用于面向對象程序設計。c+繼承了繼承了c語言語言提供的絕大部分功能和語法規(guī)定,并在此提供的絕大部分功能和語法規(guī)定,并在此基礎上作了擴充?;A上作了擴充。2021-11-3南京中醫(yī)藥大學信息技術學院29 1.4.1 c+的輸入和輸出的輸入和輸出 1.4.2 用用const 定義常變量定義常變量 1.4.3 函數原型聲明函數原型
23、聲明 1.4.4 函數的重載函數的重載 1.4.5 函數模板函數模板 1.4.6 有默認參數的函數有默認參數的函數2021-11-3南京中醫(yī)藥大學信息技術學院30 1.4.7 變量的引用變量的引用 1.4.8 內置函數內置函數 1.4.9 作用域運算符作用域運算符 1.4.10 字符串變量字符串變量 1.4.11 動態(tài)分配動態(tài)分配/回收內存運算符回收內存運算符2021-11-3南京中醫(yī)藥大學信息技術學院311.4.1 c+的輸入輸出的輸入輸出 c+為了方便使用,除了可以利用為了方便使用,除了可以利用printf和和scanf函數進行輸入和輸出外,還增加了標準輸入流輸函數進行輸入和輸出外,還增加
24、了標準輸入流輸出流出流cin和和cout。它們是在頭文件。它們是在頭文件iostream中定中定義的,標準流是不需要打開文件和關閉文件就能義的,標準流是不需要打開文件和關閉文件就能直接操作的流式文件,在此標準輸入流是指從鍵直接操作的流式文件,在此標準輸入流是指從鍵盤上輸入的數據,標準輸出流是指向屏幕輸出的盤上輸入的數據,標準輸出流是指向屏幕輸出的數據流。數據流。c+預定義的標準流如表預定義的標準流如表1.2所示。所示。2021-11-3南京中醫(yī)藥大學信息技術學院322021-11-3南京中醫(yī)藥大學信息技術學院331. 用用cout進行輸出進行輸出 格式:格式: cout 表達式表達式1表達式表
25、達式2 功能:由左向右逐個計算表達式的值,將其插入功能:由左向右逐個計算表達式的值,將其插入到輸出流到輸出流cout中。中。 cout 必須與輸出運算符必須與輸出運算符一起使用,每個一起使用,每個后后跟一個表達式,跟一個表達式,運算符的結合方向是從左向右,運算符的結合方向是從左向右,所以各個表達式的值按從左到右的順序插入到輸所以各個表達式的值按從左到右的順序插入到輸出流中。出流中。2021-11-3南京中醫(yī)藥大學信息技術學院34 for ( k = 1; k =3; k+) cout “k=“ kendl; endl是是c+輸出流的常數,在頭文件輸出流的常數,在頭文件iostream中中定義,
26、代表讓光標換行。在定義,代表讓光標換行。在c+中也可以用中也可以用”n”控制光標換行。所以輸出語句也可寫成:控制光標換行。所以輸出語句也可寫成: cout “k=“ k變量變量1 變量變量2 是是c+的提取運算符,表示從標準輸入設備取的提取運算符,表示從標準輸入設備取得數據,賦予其后的變量。得數據,賦予其后的變量。 從鍵盤輸入數值數據時,兩個數據之間用空格分從鍵盤輸入數值數據時,兩個數據之間用空格分隔或用回車分隔。隔或用回車分隔。2021-11-3南京中醫(yī)藥大學信息技術學院36 int a; float b cinab; 從鍵盤輸入從鍵盤輸入 20 32.45 2021-11-3南京中醫(yī)藥大學
27、信息技術學院37例例1.5 cin和和cout的使用的使用 #include using namespace std; int main( ) coutplease enter your name and age:name; cinage; coutyour name is nameendl; coutyour age is ageendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院381.4.2 用用const定義常變量定義常變量 格式:格式: const 類型類型 變量名變量名 = 常數常數; 例:例:const float pi= 3.14159;2021-11-
28、3南京中醫(yī)藥大學信息技術學院391.4.3 函數原型聲明函數原型聲明 c+規(guī)定,如果函數調用在函數定義之前,要求規(guī)定,如果函數調用在函數定義之前,要求在調用之前聲明該函數的原型。在調用之前聲明該函數的原型。 格式:格式:函數類型函數類型 函數名(形參表)函數名(形參表); 形參表中形參可以只寫類型。形參表中形參可以只寫類型。 例:例: int max ( int x , int y ); 或或 int max( int , int ); 其實其實c+編譯時,只檢查參數的數據類型。編譯時,只檢查參數的數據類型。2021-11-3南京中醫(yī)藥大學信息技術學院401.4.4 函數的重載函數的重載 c+
29、允許在同一個域中用一個函數名定義允許在同一個域中用一個函數名定義多個函數,這些函數的參數個數、參數類多個函數,這些函數的參數個數、參數類型不相同。型不相同。用一個函數名實現(xiàn)不同的功能,用一個函數名實現(xiàn)不同的功能,就是函數的重載就是函數的重載。 例例1.6 設計程序計算三個數中的大數設計程序計算三個數中的大數2021-11-3南京中醫(yī)藥大學信息技術學院41 #include using namespace std; int max(int a,int b,int c) /求求3個整數中的最大者個整數中的最大者 if (ba) a=b; if (ca) a=c; return a; float m
30、ax(float a,float b, float c) /求求3個實數中的最大者個實數中的最大者 if (ba) a=b; if (ca) a=c; return a; long max(long a,long b,long c) /求求3個長整數中的最大者個長整數中的最大者 if (ba) a=b; if (ca) a=c; return a; 2021-11-3南京中醫(yī)藥大學信息技術學院42 int main( ) int a,b,c; float d,e,f; long g,h,i; cinabc; cindef; cinghi; int m; m= max(a,b,c); /函數值為
31、整型函數值為整型 cout max_i=mendl; float n; n=max(d,e,f); /函數值為實型函數值為實型 coutmax_f=nendl; long int p; p=max(g,h,i); /函數值為長整型函數值為長整型 coutmax_l=pendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院43例 1.7 下面的例子說明用函數重載設計參數個數不同的下面的例子說明用函數重載設計參數個數不同的函數,用一個函數名求兩個整數或三個整數中的函數,用一個函數名求兩個整數或三個整數中的最大數。最大數。 #include using namespace st
32、d; int max(int a,int b,int c) /求求3個整數中的最大者個整數中的最大者 if (ba) a=b; if (ca) a=c; return a; 2021-11-3南京中醫(yī)藥大學信息技術學院44 int max(int a, int b) /求兩個整數中的最大者求兩個整數中的最大者 if (ab) return a; else return b; int main( ) int a=7,b=-4,c=9; coutmax(a,b,c)endl; /輸出輸出3個整數中的最大者個整數中的最大者 coutmax(a,b)endl; /輸出兩個整數中的最大者輸出兩個整數中的
33、最大者 return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院45注意:注意:不允許函數參數個數、參數類型都不允許函數參數個數、參數類型都相同,只是函數返回值不同。因為系統(tǒng)無相同,只是函數返回值不同。因為系統(tǒng)無法從調用形式上判斷調用與哪個函數相匹法從調用形式上判斷調用與哪個函數相匹配。配。2021-11-3南京中醫(yī)藥大學信息技術學院461.4.5 函數模板函數模板 如果兩個函數的參數個數相同,函數的行為相同如果兩個函數的參數個數相同,函數的行為相同(做同樣的事),只是函數和參數的數據類型不同,(做同樣的事),只是函數和參數的數據類型不同,如果用函數重載的話,編寫的函數代碼是相同的,如
34、果用函數重載的話,編寫的函數代碼是相同的,為了節(jié)省時間,為了節(jié)省時間,c+提供了函數模板功能。提供了函數模板功能。 格式:格式:template 函數定義(函數的類型和參數的類型用聲明的標識函數定義(函數的類型和參數的類型用聲明的標識符表示)符表示)2021-11-3南京中醫(yī)藥大學信息技術學院47template 是關鍵字,含義是模板。是關鍵字,含義是模板。typename 是關鍵字,表示其后的標識符代表類是關鍵字,表示其后的標識符代表類型參數,調用時根據實參的類型確定形參的類型。型參數,調用時根據實參的類型確定形參的類型。所謂函數模板,是建立一個通用函數,不指定函所謂函數模板,是建立一個通用
35、函數,不指定函數類型和參數類型,而用一個虛擬的類型表示。數類型和參數類型,而用一個虛擬的類型表示。在調用函數時,用實參的類型取代模板中的虛擬在調用函數時,用實參的類型取代模板中的虛擬類型。類型。例例1.8 為計算兩個數中的大數定義函數模板為計算兩個數中的大數定義函數模板2021-11-3南京中醫(yī)藥大學信息技術學院48 #include using namespace std; template t max(t a,t b,t c) /用虛擬類型t表示類型 if(ba) a=b; if(ca) a=c; return a; 2021-11-3南京中醫(yī)藥大學信息技術學院49 int main()
36、int i1=8,i2=5,i3=6,i; double d1=56.9,d2=90.765,d3=43.1,d; long g1=67843,g2=-456,g3=78123,g; i=max(i1,i2,i3); d=max(d1,d2,d3); g=max(g1,g2,g3); couti_max=iendl; coutd_max=dendl; coutg_max=gendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院50 從程序中看到,此問題用函數模板比用函從程序中看到,此問題用函數模板比用函數重載更方便。數重載更方便。注意,注意,函數模板只適用于函數模板只適用
37、于函數參數的個數相同而類型不同,并且函函數參數的個數相同而類型不同,并且函數體相同的情況,如果函數的參數個數不數體相同的情況,如果函數的參數個數不同,則不能用函數模板。同,則不能用函數模板。2021-11-3南京中醫(yī)藥大學信息技術學院511.4.6 有默認參數的函數有默認參數的函數 c+允許為函數的參數設置默認值,這時調用函數時,如允許為函數的參數設置默認值,這時調用函數時,如果沒有實參,就以默認值作為實參值。果沒有實參,就以默認值作為實參值。格式:格式:形參類型形參類型 形參變量名形參變量名 = 常數常數功能:調用函數時,如果沒有實參,就以常數作為該形參功能:調用函數時,如果沒有實參,就以常
38、數作為該形參的值的值;如果有實參,仍以實參的值作為該形參的值。如果有實參,仍以實參的值作為該形參的值。注意:注意:有默認值的形參必須放在形參表的右邊,不允許無有默認值的形參必須放在形參表的右邊,不允許無默認參數值和有默認參數值的形參交錯排列。默認參數值和有默認參數值的形參交錯排列。2021-11-3南京中醫(yī)藥大學信息技術學院52例:編寫計算圓柱體體積函數例:編寫計算圓柱體體積函數float volume ( float h, float r = 12.5)調用可以采用以下任何一種形式:調用可以采用以下任何一種形式:volume( 45.6);volume( 32.5, 10.5);函數參數結合
39、從左到右,用第一種方式調用時,函數參數結合從左到右,用第一種方式調用時,只有一個實參,圓半徑的值取默認值只有一個實參,圓半徑的值取默認值12.5,用第,用第二種方式調用時,有兩個實參,圓半徑的值取實二種方式調用時,有兩個實參,圓半徑的值取實參的值參的值10.5。2021-11-3南京中醫(yī)藥大學信息技術學院53 注意:注意: 1、如果用函數原型聲明,只要在函數原型聲明、如果用函數原型聲明,只要在函數原型聲明中定義形參的默認值即可。中定義形參的默認值即可。 2、一個函數名不能同時用于重載函數和帶默認、一個函數名不能同時用于重載函數和帶默認形參值的函數。當調用函數時,如少寫一個參數,形參值的函數。當
40、調用函數時,如少寫一個參數,系統(tǒng)無法判斷是利用重載函數還是利用帶默認參系統(tǒng)無法判斷是利用重載函數還是利用帶默認參數值的函數,出現(xiàn)二義性。數值的函數,出現(xiàn)二義性。2021-11-3南京中醫(yī)藥大學信息技術學院54 例如將例如將例例1.7中的第三行改為中的第三行改為 int max (int a, int b, int c = 100); 此時此時 max是重載函數,又帶默認參數值,如果出是重載函數,又帶默認參數值,如果出現(xiàn)現(xiàn)max( 5, 23)形式的調用,編譯系統(tǒng)無法斷定調形式的調用,編譯系統(tǒng)無法斷定調用哪個函數,于是發(fā)出編譯出錯的信息。用哪個函數,于是發(fā)出編譯出錯的信息。2021-11-3南京
41、中醫(yī)藥大學信息技術學院551.4.7 變量的引用變量的引用 c+提供了為變量取別名的功能,這就是變量的提供了為變量取別名的功能,這就是變量的引用。引用。 格式:格式: 類型類型 &變量變量1 = 變量變量2; 變量變量2是在此之前已經定義過的變量,且與變量是在此之前已經定義過的變量,且與變量1的類型相同。這里為變量的類型相同。這里為變量2定義一個別名變量定義一個別名變量1,在程序里變量在程序里變量1和變量和變量2 就是同一個變量。就是同一個變量。 注意:注意:兩個變量不能用同一個別名。兩個變量不能用同一個別名。2021-11-3南京中醫(yī)藥大學信息技術學院56例:例:int a = 3
42、,b =4; int &c = a; / c是是a 的別名的別名 int &c = b; / 錯誤的用法錯誤的用法一個變量可以有多個別名一個變量可以有多個別名例:例:int a = 3; int & b= a; int & c= b;變量變量a 有兩個別名有兩個別名b和和c。2021-11-3南京中醫(yī)藥大學信息技術學院57 #include using namespace std; int main( ) int a=10; int &b=a; /聲明聲明b是是a的引用的引用 a=a*a; /a的值變化了,的值變化了,b的值也應一起變化的值也應一起變化
43、couta bendl; b=b/5; /b的值變化了,的值變化了,a的值也應一起變化的值也應一起變化 coutb aendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院58圖圖1.1程序運行結果如下:程序運行結果如下:100 10020 202021-11-3南京中醫(yī)藥大學信息技術學院59將引用作為函數參數將引用作為函數參數 c+除了可以用普通變量、指針變量做形參外,除了可以用普通變量、指針變量做形參外,還可以用引用變量做形參。還可以用引用變量做形參。(1)用普通變量做形參)用普通變量做形參 這時傳遞的是實參的值,在函數內形參與實這時傳遞的是實參的值,在函數內形參與實
44、參是兩個不同的內存單元,對形參的修改不會影參是兩個不同的內存單元,對形參的修改不會影響實參的值。響實參的值。例例1.10無法實現(xiàn)兩個變量的值互換的程序無法實現(xiàn)兩個變量的值互換的程序2021-11-3南京中醫(yī)藥大學信息技術學院60 #include using namespace std; void swap(int a,int b) int temp; temp=a; a=b; b=temp; / 實現(xiàn)實現(xiàn)a和和b的值互換的值互換 2021-11-3南京中醫(yī)藥大學信息技術學院61 int main( ) int i=3,j=5; swap(i,j); couti,jendl; / i和和j的值
45、未互換的值未互換 return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院62圖圖1.22021-11-3南京中醫(yī)藥大學信息技術學院63(2)用指針變量做形參)用指針變量做形參 c語言還允許用指針變量做形參,這語言還允許用指針變量做形參,這時傳遞的是實參變量的地址(指針),在時傳遞的是實參變量的地址(指針),在函數內利用這個指針訪問實參變量。函數內利用這個指針訪問實參變量。例例1.11 用指針變量做形參,實現(xiàn)兩個變量用指針變量做形參,實現(xiàn)兩個變量值的交換。值的交換。2021-11-3南京中醫(yī)藥大學信息技術學院64 #include using namespace std; void s
46、wap(int *p1,int *p2) int temp; temp=*p1; *p1= *p2; *p2=temp; 2021-11-3南京中醫(yī)藥大學信息技術學院65 int main( ) int i=3,j=5; swap(&i,&j); couti,jendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院66圖圖1.3 2021-11-3南京中醫(yī)藥大學信息技術學院67 (3)用引用變量做形參)用引用變量做形參 用指針變量做形參,它將實參變量的地址傳用指針變量做形參,它將實參變量的地址傳遞給形參,在函數內用遞給形參,在函數內用“*指針變量指針變量”
47、的方式訪問的方式訪問實參變量。我們知道引用變量是變量的別名,在實參變量。我們知道引用變量是變量的別名,在調用函數時,用引用變量做的形參就成了實參變調用函數時,用引用變量做的形參就成了實參變量的別名,在函數中用的形參名就是實參的別名,量的別名,在函數中用的形參名就是實參的別名,這樣比用指針變量更直觀、更方便。這樣比用指針變量更直觀、更方便。2021-11-3南京中醫(yī)藥大學信息技術學院68 例例1.12 利用引用變量實現(xiàn)兩個變量值的交換利用引用變量實現(xiàn)兩個變量值的交換 #include using namespace std; void swap(int &a,int &b) in
48、t temp; temp=a; a=b; b=temp; 2021-11-3南京中醫(yī)藥大學信息技術學院69 int main( ) int i=3,j=5; swap(i,j); couti=i j=jendl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院70圖圖1.4 2021-11-3南京中醫(yī)藥大學信息技術學院71對引用的進一步說明對引用的進一步說明 (1)引用變量都具有非)引用變量都具有非void類型類型 (2)不能建立引用的數組)不能建立引用的數組 (3)可以建立常引用變量,不允許修改常引用)可以建立常引用變量,不允許修改常引用變量的值變量的值 例:例: int
49、i ; const int &a = i; a = 3; / 錯誤的用法錯誤的用法 i = 8; / i 不是常變量,可以修改不是常變量,可以修改2021-11-3南京中醫(yī)藥大學信息技術學院72 (4)可以建立指針變量的引用變量)可以建立指針變量的引用變量 例:例:int i; int *p = & i; int * &pt = p; / pt是是p的別名變量,同時的別名變量,同時 / 也是指針變量也是指針變量2021-11-3南京中醫(yī)藥大學信息技術學院731.4.8 內置函數內置函數 c+ 提供了一種機制,在編譯時,將所調用的函數的提供了一種機制,在編譯時,將所調用的
50、函數的代碼嵌入到調用函數代碼中,在執(zhí)行函數時省去了調用環(huán)代碼嵌入到調用函數代碼中,在執(zhí)行函數時省去了調用環(huán)節(jié),提高了函數的執(zhí)行速度。這種機制稱為內置函數,有節(jié),提高了函數的執(zhí)行速度。這種機制稱為內置函數,有的書稱內聯(lián)函數。的書稱內聯(lián)函數。格式:格式: inline 函數類型函數類型 函數名函數名(形參表形參表) 函數體函數體 inline 是是c+的關鍵字,在編譯時,編譯程序會把這個的關鍵字,在編譯時,編譯程序會把這個函數嵌入到調用函數的函數體中。函數嵌入到調用函數的函數體中。調用格式:調用格式: 函數名(實參表)函數名(實參表)2021-11-3南京中醫(yī)藥大學信息技術學院74 例例1.13計
51、算三個整數中的大數計算三個整數中的大數 #include using namespace std; inline int max(int a,int b,int c) / 這是一個內置函數,這是一個內置函數, / 求求3個整數中的最大者個整數中的最大者 if (ba) a=b; if (ca) a=c; return a; int main( ) int i=7,j=10,k=25,m; m=max(i,j,k); coutmax=ma) a=b; if ( ca) a=c; m=a; 2021-11-3南京中醫(yī)藥大學信息技術學院76 例例1.15用內置函數計算平方根用內置函數計算平方根 #i
52、nclude using namespace std; inline int power(int x) /定義內置函數定義內置函數 return x*x; int main() coutpower(2)endl; coutpower(1+1)endl; return 0; 2021-11-3南京中醫(yī)藥大學信息技術學院77 編譯程序遇見內置函數編譯程序遇見內置函數power時,先求出函數的時,先求出函數的實參值(實參值(1+1=2),然后用),然后用power函數體代替函函數體代替函數調用,調用語句變成:數調用,調用語句變成: cout2*2endl; cout2*2endl;運行結果是運行結果
53、是44 2021-11-3南京中醫(yī)藥大學信息技術學院78使用內置函數可以節(jié)省程序的運行時間,使用內置函數可以節(jié)省程序的運行時間,但增加了目標程序的長度。所以在使用時但增加了目標程序的長度。所以在使用時要衡量時間和空間的得失。要衡量時間和空間的得失。2021-11-3南京中醫(yī)藥大學信息技術學院791.4.9 作用域運算符作用域運算符 不是所有的變量在程序運行的時時刻刻都是可不是所有的變量在程序運行的時時刻刻都是可見的。有的變量在整個程序運行期間都是可見的,見的。有的變量在整個程序運行期間都是可見的,稱它們?yōu)榉Q它們?yōu)槿肿兞咳肿兞?;有的變量只能在一個函數中;有的變量只能在一個函數中可知,被稱為可
54、知,被稱為局部變量局部變量。 每個變量都有其有效的每個變量都有其有效的作用域作用域,程序只能在變,程序只能在變量的有效的作用域內使用變量,不能直接使用其量的有效的作用域內使用變量,不能直接使用其他域中的變量。他域中的變量。2021-11-3南京中醫(yī)藥大學信息技術學院80程序的內存區(qū)域程序的內存區(qū)域程序的內存空間程序的內存空間代碼區(qū)代碼區(qū)全局數據區(qū)全局數據區(qū)堆區(qū)堆區(qū)棧區(qū)棧區(qū)程序中各個函數的代碼程序中各個函數的代碼程序中全局數據和靜態(tài)數據程序中全局數據和靜態(tài)數據程序中的動態(tài)數據程序中的動態(tài)數據程序中各函數內的數據程序中各函數內的數據2021-11-3南京中醫(yī)藥大學信息技術學院81例例1.16 局部變量和全局變量同名局部變量和全局變量同名#includ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年太陽能電池生產專用設備項目建議書
- 2025年汽車車速傳感器項目合作計劃書
- 2025年應急救生系統(tǒng)項目建議書
- 貴州省黔東南苗族侗族自治州2024-2025學年高一上學期1月期末考試 語文 含解析
- 2025年新型分子篩系列產品項目建議書
- 客戶服務層次化響應體系構建
- 娛樂行業(yè)演出安全協(xié)議書
- Rebaudioside-E-Standard-生命科學試劑-MCE
- 伊索寓言小動物的故事解讀
- 監(jiān)控采購安裝合同
- 硫酸分公司30萬噸硫磺制酸試車方案
- 高壓氧科工作總結高壓氧科個人年終總結.doc
- 電子電路基礎習題解答
- 《政治學概論》教學大綱
- 食品生物化學習題謝達平(動態(tài))
- 保安員工入職登記表
- 斷路器控制回路超詳細講解
- 簽證戶口本完整翻譯模板
- 睿達RDCAM激光雕刻切割軟件V5.0操作說明書
- 變電設備運行與維護培訓課件(共102頁).ppt
- 機械設計基礎平面連桿機構課件
評論
0/150
提交評論