版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
面向?qū)ο蟮某绦蛟O(shè)計語言C++面向?qū)ο蟮某绦蛟O(shè)計語言C++面向?qū)ο蟪绦蛟O(shè)計語言前言第1節(jié)C++語言概述第2節(jié)數(shù)據(jù)類型和表達(dá)式第3節(jié)預(yù)處理和語句第4節(jié)函數(shù)和作用域第5節(jié)類和對象(一)第6節(jié)類和對象(二)第7節(jié)繼承性和派生類第8節(jié)多態(tài)性和虛函數(shù)第9節(jié)C++的I/O流庫面向?qū)ο蟪绦蛟O(shè)計語言前言面向?qū)ο蟮某绦蛟O(shè)計語言1、面向?qū)ο蟮某绦蛟O(shè)計語言必須支持下列概念:封裝的對象類和實例的概念類間的繼承多態(tài)性2、面向?qū)ο蟪绦蛟O(shè)計語言的基本特征:對象、類、繼承性、信息隱藏、強(qiáng)類型化、并發(fā)性、持久性。面向?qū)ο蟮某绦蛟O(shè)計語言1、面向?qū)ο蟮某绦蛟O(shè)計語言必須支持下列1.1C語言與面向?qū)ο蟮腃++
(1)C語言既具備高級語言的結(jié)構(gòu)和編程環(huán)境,又提供類似于匯編語言那樣的系統(tǒng)資源操縱能力及程序執(zhí)行效率。適合解決有實時要求的問題。C語言的主要特點:(2)有豐富的運(yùn)算符和數(shù)據(jù)類型,表達(dá)式類型多樣化,可以方便地實現(xiàn)在其他語言中較難實現(xiàn)的運(yùn)算,對各種不同類型的程序設(shè)計都有良好的適應(yīng)性。(3)以函數(shù)為基礎(chǔ)實現(xiàn)程序的結(jié)構(gòu)化設(shè)計,支持大型程序的多文件構(gòu)成及單個文件獨(dú)立編譯,適合大型復(fù)雜程序的設(shè)計。(4)語言簡潔、緊湊,使用方便、靈活,書寫形式自由。(5)可移植性好。1.1C語言與面向?qū)ο蟮腃++(1)C語言既具備高級語言1.1C語言與面向?qū)ο蟮腃++
C++是由C發(fā)展成為的以面向?qū)ο鬄橹饕卣鞯恼Z言。作為C語言的超集,C++繼承了C的所有優(yōu)點,又對數(shù)據(jù)類型做了擴(kuò)充,使得編譯系統(tǒng)可以檢查出更多類型錯誤。C++支持面向?qū)ο蟪绦蛟O(shè)計,通過類和對象的概念把數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起,通過派生、繼承、重載和多態(tài)性等特征實現(xiàn)了軟件重用和程序自動生成,使得大型復(fù)雜軟件的構(gòu)造和維護(hù)變得更加有效和容易。1.1C語言與面向?qū)ο蟮腃++C++是由C發(fā)展成為的以面1.2C++對面向?qū)ο蟪绦蛟O(shè)計方法的支持C++支持?jǐn)?shù)據(jù)封裝(數(shù)據(jù)抽象)C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實現(xiàn);C++中包含有私有、公有和保護(hù)成員
每個可能的消息對應(yīng)一個相應(yīng)的方法,方法通過函數(shù)來定義;C++中通過發(fā)送消息來處理對象C++中允許友元破壞封裝性C++中允許函數(shù)名和運(yùn)算符重載C++支持繼承性C++支持動態(tài)聯(lián)編1.2C++對面向?qū)ο蟪绦蛟O(shè)計方法的支持C++支持?jǐn)?shù)據(jù)封裝1.2.2C++對C語言的改進(jìn)增加了新的運(yùn)算符:::,new,delete等;改進(jìn)了類型系統(tǒng),增加了安全性;引進(jìn)了引用概念;允許函數(shù)重載,允許設(shè)置缺省參數(shù),提高了編程的靈活性;引進(jìn)了內(nèi)聯(lián)函數(shù),提高了程序的效率;可以根據(jù)需要隨時對變量進(jìn)行說明;1.2.2C++對C語言的改進(jìn)增加了新的運(yùn)算符:::,n1.3C++程序的編輯、編譯和運(yùn)行一、編輯:源文件的擴(kuò)展名為.cpp二、編譯1、預(yù)處理過程詞法分析:單詞語法分析:構(gòu)造程序的格式符號表:程序中的各種符號及其屬性錯誤處理程序:生成目標(biāo)代碼:目標(biāo)文件擴(kuò)展名.obj2、編譯過程3、連接過程:可執(zhí)行文件擴(kuò)展名.exe三、運(yùn)行1.3C++程序的編輯、編譯和運(yùn)行一、編輯:源文件的擴(kuò)展名1.3C++程序的編輯、編譯和運(yùn)行(續(xù))源程序.cpp目標(biāo)文件.obj可執(zhí)行文件.exe編譯器連接器磁盤中的#include文件C++庫文件.LIB1.3C++程序的編輯、編譯和運(yùn)行(續(xù))源程序.cpp目標(biāo)1.4.1C++的字符集大小寫的英文字母:a~z,A~Z數(shù)字字符:0~9特殊字符1.4.1C++的字符集大小寫的英文字母:a~z,A~Z數(shù)1.4.2詞法記號1、關(guān)鍵字(保留字)表1-1C++的關(guān)鍵字1.4.2詞法記號1、關(guān)鍵字(保留字)表1-1C++的關(guān)1.4.2詞法記號(續(xù))2、標(biāo)識符組成規(guī)則:以字母或下劃線開始,其后跟零個或多個字母、數(shù)字或下劃線;不能以數(shù)字開始正確標(biāo)識符:Result,DoubleList,_first,first_錯誤標(biāo)識符:1first標(biāo)識符的長度任意(受編譯器限制);區(qū)分字母的大小寫;不能使用系統(tǒng)的保留字;例如:ADD,Add,add1.4.2詞法記號(續(xù))2、標(biāo)識符組成規(guī)則:以字母或下劃線1.4.2詞法記號(續(xù))3、運(yùn)算符單目雙目三目運(yùn)算符5、分隔符(){},分隔符:4、各種文字?jǐn)?shù)字字符文字串文字文字布爾文字;1.4.2詞法記號(續(xù))3、運(yùn)算符單目雙目三目運(yùn)算符5、分1.4.3空白一、空白包括:空格、制表符、換行符、注釋功能:指示詞法記號的開始和結(jié)束位置;二、注釋/*……*///1.4.3空白一、空白包括:空格、制表符、換行符、注釋功能1.5C++程序的結(jié)構(gòu)一、C++示范程序#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程序的組成預(yù)處理命令輸入輸出函數(shù)語句變量其他I/O流庫,提供所有的輸入輸出操作cout:流類對象<<:插入符提供屏幕輸出;提供鍵盤輸入:cin:流類對象>>:提取符例如:cout<<"Pleaseinputtwointegers:";cin>>a>>b;endl:換行;1.5C++程序的結(jié)構(gòu)一、C++示范程序#include1.6vc++程序設(shè)計環(huán)境1.VC++可視化集成開發(fā)環(huán)境1.6vc++程序設(shè)計環(huán)境1.VC++可視化集成開發(fā)環(huán)境(1)建立控制臺程序的基本步驟建立一個程序,運(yùn)行后輸出“ThisisaC++program.”,源程序如下:#include<iostream.h>voidmain(){ cout<<"ThisisaC++program"<<endl;}創(chuàng)建新工程創(chuàng)建C++源程序文件編譯連接和運(yùn)行源程序關(guān)閉、打開工作區(qū)2.VC++環(huán)境下的程序開發(fā)實例
(1)建立控制臺程序的基本步驟2.VC++環(huán)境下的程序開發(fā)實輸出結(jié)果輸出結(jié)果(2)基于MFC的程序開發(fā)的基本步驟這里以設(shè)計一個如下圖所示的對話框窗口程序(2)基于MFC的程序開發(fā)的基本步驟建立新的工程文件建立新的工程文件選擇可視化控件拖到對話框窗口 進(jìn)入編輯屏幕后,首先規(guī)劃對話框窗口的布局,確定對話框窗口的界面。在控件面板中選擇相應(yīng)的控件后拖放到對話框窗口的適當(dāng)位置
選擇可視化控件拖到對話框窗口設(shè)置控件的屬性 在屬性對話框中設(shè)置控件的屬性,如“StaticText”、“Button”控件的“Caption”屬性為新生成的類定義公有數(shù)據(jù)成員和方法設(shè)置控件的屬性為新的對話框類添加方法
即為對話框中的某些控件添加事件代碼。比如本例希望單擊“Button1”按鈕后,能將IDC_Edit1中的文本復(fù)制到IDC_Edit2中來,就需要為“Button1”按鈕添加“單擊”事件代碼,下面是該事件的實現(xiàn)代碼:voidCExampleDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstrExpression; m_edit1.GetWindowText(strExpression); m_edit2.SetWindowText(strExpression);}最后Compile或Build程序,得到可執(zhí)行的應(yīng)用程序為新的對話框類添加方法第2節(jié)數(shù)據(jù)類型和表達(dá)式2.1基本數(shù)據(jù)類型2.2常量和變量2.3數(shù)組類型2.4枚舉類型2.5指針和引用2.6運(yùn)算符2.7表達(dá)式2.8類型定義第2節(jié)數(shù)據(jù)類型和表達(dá)式2.1基本數(shù)據(jù)類型2.1基本數(shù)據(jù)類型一、基本數(shù)據(jù)類型整型int浮點型(實型)字符型char基本數(shù)據(jù)類型邏輯型bool空值型void單精度浮點數(shù)float雙精度浮點數(shù)double用于函數(shù)和指針2.1基本數(shù)據(jù)類型一、基本數(shù)據(jù)類型整型int浮點型(實型)2.1基本數(shù)據(jù)類型(續(xù))二、數(shù)據(jù)類型修飾符signed:有符號unsigned:無符號short:短型long:長型說明:3)
long修飾符還適用于雙精度浮點數(shù);2)上述修飾符均可用于整型和字符型;1)類型修飾符可以修飾除void、bool類型以外的其他類型;2.1基本數(shù)據(jù)類型(續(xù))二、數(shù)據(jù)類型修飾符signed:有2.1基本數(shù)據(jù)類型(續(xù))三、基本數(shù)據(jù)類型列表表2-1C++的基本數(shù)據(jù)類型2.1基本數(shù)據(jù)類型(續(xù))三、基本數(shù)據(jù)類型列表表2-1C+2.1基本數(shù)據(jù)類型(續(xù))說明:1)表中的[int]可以省略,即在int之前有修飾符出現(xiàn)時,可以省略關(guān)鍵字int;2)單精度類型float、雙精度類型double、長精度類型longdouble統(tǒng)稱浮點類型;3)char類型和各種int類型統(tǒng)稱整型類型;char類型變量在內(nèi)存中以它的ASCII碼值的形式存儲;4)字寬(字節(jié))取決于操作系統(tǒng)和編譯器的實現(xiàn),可用sizeof驗證;2.1基本數(shù)據(jù)類型(續(xù))說明:1)表中的[int]可以省2.2.1常量一、整型常量(無小數(shù)部分)1、表示方法十進(jìn)制八進(jìn)制十六進(jìn)制2、十進(jìn)制表示由0~9的數(shù)字組成不能以0開始無前綴例:132,-3453、八進(jìn)制表示由0~7的數(shù)字組成以0為前綴例:010,-05364、十六進(jìn)制表示由0~9的數(shù)字及A~F的字母(大小寫均可)組成以0x或0X為前綴例:0x7A,-0X3de2.2.1常量一、整型常量(無小數(shù)部分)1、表示方法十進(jìn)制2.2.1常量(續(xù))5、說明:1)長整型用L(或l)做后綴表示。例如:32765L,793l;2)無符號型用U(或u)做后綴表示。例如:4352U,3100u;3)unsignedlong型用后綴U(或u)和L(或l)一起表示,L與U的先后順序無關(guān)。例如:49321ul,37825LU,41152Lu;4)無后綴時,整型常量類型按如下順序確定:
int,(unsigned),long,unsignedlong十進(jìn)制時無2.2.1常量(續(xù))5、說明:1)長整型用L(或l)做后2.2.1常量(續(xù))二、浮點型常量由整數(shù)部分和小數(shù)部分構(gòu)成;只有十進(jìn)制表示;一般表示形式(小數(shù)表示形式):整數(shù)部分與小數(shù)部分可以省去一部分,但不能全部省去;例如:5.,.25,4.072.2.1常量(續(xù))二、浮點型常量由整數(shù)部分和小數(shù)部分構(gòu)成2.2.1常量(續(xù))科學(xué)表示形式:在小數(shù)表示法后面加E(或e)表示指數(shù);例如:23.5E6,.032E-5,.3e10指數(shù)部分可正可負(fù),但必須為整數(shù);浮點常量的缺省數(shù)據(jù)類型為double型;后綴F(或f)表示float類型;后綴l(或l)表示longdouble類型;2.2.1常量(續(xù))科學(xué)表示形式:在小數(shù)表示法后面加E(或2.2.1常量(續(xù))三、字符常量由一對單引號括起的一個字符表示;其值為所括起字符在ASCII表中的編碼;所括起字符的表示方法:圖形表示法該方法適用于有圖形符號的可打印字符;例如:'A','a','*'轉(zhuǎn)義序列表示法該方法適用于所有字符,尤其是無圖形符號的不可打印字符;2.2.1常量(續(xù))三、字符常量由一對單引號括起的一個字符2.2.1常量(續(xù))轉(zhuǎn)義序列表示方法:以反斜線(\)開頭,后跟字符的ASCII碼值;八進(jìn)制表示:\ddd;例如:\101十六進(jìn)制表示:\xhh;例如:\x41表2-2C++中常用轉(zhuǎn)義序列符2.2.1常量(續(xù))轉(zhuǎn)義序列表示方法:以反斜線(\)開頭,2.2.1常量(續(xù))四、布爾常量有兩個值:true和false;五、字符串常量(串常量,字符串)一對雙引號括起的字符序列,字符序列可以包含空格、轉(zhuǎn)義序列或任何其他字符,這些字符不一定是C++字符集中的字符,只要C++編譯器支持即可;例如:"Thisisastring;"串常量與字符常量的區(qū)別:2.2.1常量(續(xù))四、布爾常量有兩個值:true和f2.2.1常量(續(xù))由一個字符型變量存放由一維數(shù)組存放字符常量串常量用單引號括起用雙引號括起字符串有一個結(jié)束符,該結(jié)束符用'\0'表示字符常量'a'在內(nèi)存中占用一個字節(jié)字符串常量"a"在內(nèi)存中占用兩個字節(jié)可進(jìn)行加、減法運(yùn)算可進(jìn)行連接、拷貝運(yùn)算2.2.1常量(續(xù))由一個字符型變量存放由一維數(shù)組存放字符2.2.1常量(續(xù))六、符號常量用來表示C++中的常量,即用一個與常量相關(guān)的標(biāo)識符來替代常量;優(yōu)點:增加可讀性,增強(qiáng)可維護(hù)性;例如:PI表示3.1415926定義方法:使用類型說明符const;例如:constintsize=80;定義的符號常量必須初始化;一個符號常量可看作是一個只讀變量,由const定義的常量的值不可以改變;2.2.1常量(續(xù))六、符號常量用來表示C++中的常量,即Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }
2.2.1常量(續(xù))constdoubler=3.2;錯誤錯誤,不能修改pi的值Line1: #include<iostream.h>2.地址值2.2.2變量一、變量的三個基本要素名字類型值三要素數(shù)據(jù)值地址值intc;c=5;內(nèi)存5......c地址值1000H變量類型變量名數(shù)據(jù)值二、變量的定義可以在程序中隨時定義變量,只要在該變量被使用前定義即可;定義格式:<類型><變量名表>;例如:inta,b,c;doublex,y,z;地址值2.2.2變量一、變量的三個基本要素名字類型值三要素2.2.2變量(續(xù))同一程序塊內(nèi)不可以定義同名變量;初始值變量定義時可賦初始值;聲明格式:數(shù)據(jù)類型標(biāo)識符1(初始值1),…,標(biāo)識符n(初始值n);數(shù)據(jù)類型標(biāo)識符1=初始值1,…,標(biāo)識符n=初始值n;例如:doubleprice=15.5;intsize=100;未被初始化的變量的值或者是默認(rèn)值,或者是無效值,由變量類型決定;變量可被賦值,由變量名標(biāo)識;2.2.2變量(續(xù))同一程序塊內(nèi)不可以定義同名變量;初始值2.3數(shù)組類型數(shù)目固定、類型相同的若干個變量的有序集合;2.3數(shù)組類型數(shù)目固定、類型相同的若干個變量的有序集合2.3.1數(shù)組的定義1、格式<類型><數(shù)組名>[<大小1>][<大小2>]…;說明:方括號([])表示數(shù)組的維;某維的大小必須是大于1的常量表達(dá)式;2、示例inta[3];charb[3][5];constintsize=80;intm[size];2.3.1數(shù)組的定義1、格式<類型><數(shù)組名>[<大小12.3.2數(shù)組的賦值1、數(shù)組元素的表示下標(biāo)表示:<數(shù)組名>[<下標(biāo)表達(dá)式1>][<下標(biāo)表達(dá)式2>]…;說明:<下標(biāo)表達(dá)式>為常量表達(dá)式;下標(biāo)從0開始;各個元素在內(nèi)存中按其下標(biāo)的升序順序連續(xù)存放;指針表示:2.3.2數(shù)組的賦值1、數(shù)組元素的表示下標(biāo)表示:<數(shù)組名>2.3.2數(shù)組的賦值(續(xù))2、數(shù)組元素賦初值利用初始值表(由一對花括號括起來的若干數(shù)據(jù)項組成)實現(xiàn);數(shù)組元素的個數(shù)要大于等于初始值表中數(shù)據(jù)項的個數(shù);例如:inta[5]={1,2,3,4,5};inta[4]={5,4};intb[2][3]={{1,2,3},{4,5,6}};intb[2][3]={1,2,3,4,5,6};3、數(shù)組元素的賦值例如:intm[3];m[0]=5;m[1]=3;m[2]=1;2.3.2數(shù)組的賦值(續(xù))2、數(shù)組元素賦初值利用初始值表(2.3.3字符數(shù)組說明:字符數(shù)組是指數(shù)組元素是char類型的數(shù)組;注意字符常量、字符數(shù)組與字符串常量的區(qū)別;例如:chars1[4]={'a','b','c','d'};字符數(shù)組chars2[5]={'a','b','c','d','\0'};字符數(shù)組(字符串常量)等價于chars2[5]="abcd";chars3[5]="abcde";╳chars3[]="abcde";2.3.3字符數(shù)組說明:字符數(shù)組是指數(shù)組元素是char類型2.4枚舉類型枚舉類型是若干個有名字的整型常量的集合;2.4枚舉類型枚舉類型是若干個有名字的整型常量的集合;2.4.1枚舉聲明和枚舉變量一、枚舉聲明enum<枚舉名>{<枚舉表>};<枚舉表>由若干個枚舉符組成,多個枚舉符之間用逗號分隔;枚舉符是用標(biāo)識符表示的整型常量,又稱枚舉常量;枚舉常量的值默認(rèn)為最前邊的一個為0,其后的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個值的基礎(chǔ)上加1;2.4.1枚舉聲明和枚舉變量一、枚舉聲明enum<枚舉名2.4.1枚舉聲明和枚舉變量(續(xù))二、枚舉變量例如:enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};枚舉變量的值不一定互不相同;enum<枚舉名><枚舉變量名表>;多個枚舉變量之間用逗號分隔;例如:enumdayd1,d2,d3;enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2,d3;2.4.1枚舉聲明和枚舉變量(續(xù))二、枚舉變量例如:enu2.4.2枚舉變量的值其值是該枚舉變量所屬的枚舉聲明的枚舉表的某一個枚舉符;利用枚舉符所表示的整型值給枚舉變量賦值時,需要進(jìn)行類型強(qiáng)制;例如:d1=Sun;d2=Sat;
d3=(enumday)4;2.4.2枚舉變量的值其值是該枚舉變量所屬的枚舉聲明的枚舉2.5.1指針1、什么是指針指針是用來存放某個變量的地址值的一種變量;指針的類型是它所指向變量的類型;指針本身數(shù)據(jù)值的類型是unsignedlongint型;例如:inta(5);int*p=&a;內(nèi)存1000H5...a地址值1000H3000Hp2.5.1指針1、什么是指針指針是用來存放某個變量的地址值2.5.1指針(續(xù))2、如何定義指針例如:int*pi;char(*pa)[3];float*pl;int(*pf)();char*pc;int*pp;<類型>*<指針名1>,*<指針名2>,…;3、指針的賦值(內(nèi)存地址值)指針必須被賦值后才可使用;一般變量、數(shù)組元素、結(jié)構(gòu)成員的地址值為變量名前加運(yùn)算符&;數(shù)組的地址值用該數(shù)組名表示;2.5.1指針(續(xù))2、如何定義指針例如:<類型>*<指2.5.1指針(續(xù))函數(shù)的地址值用該函數(shù)的名字表示;例如:inta,b[10];doublesin(doublex);int*p=&a,*p=&b[3];double(*pf)();inta[10],*p=a;pf=sin;3、指針的運(yùn)算賦值運(yùn)算。例如:inta,*p=&a,*q;q=p;一個指針可以加上或減去一個整數(shù)值;2.5.1指針(續(xù))函數(shù)的地址值用該函數(shù)的名字表示;例如:a與&a[0]相同2.5.2指針和數(shù)組1、C++中指針與數(shù)組的關(guān)系C++通過指針訪問數(shù)組中的每個元素;2、一維數(shù)組的指針表示法C++中規(guī)定:任何一個數(shù)組的名字是一個常量指針,其值是該數(shù)組的首元素的地址值;例如:inta[5];數(shù)組表示法:a[i],i=0,1,2,3,4
指針表示法:*(a+i)a與&a[0]2.5.2指針和數(shù)組1、C++中指針與數(shù)組的2.5.2指針和數(shù)組(續(xù))3、二維數(shù)組的指針表示法intb[2][5];數(shù)組表示法:b[i][j]i=0,1;j=0,1,2,3,4指針表示法:*((b+i)+j)*(b[i]+j)(*(b+i))[j](&b[0][0]+5*i+j)4、三維數(shù)組的指針表示法(同二維)5、示例2.5.2指針和數(shù)組(續(xù))3、二維數(shù)組的指針表示法int2.5.2指針和數(shù)組(續(xù))例2.1:分析下列程序的輸出結(jié)果。#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];j=*(a+2)+*(a+4);cout<<i<<endl<<j<<endl;}輸出644a[1]5a[0]3a[2]2a[3]1a[4]aa+2a+42.5.2指針和數(shù)組(續(xù))例2.1:分析下列程序的輸出結(jié)果2.5.3引用標(biāo)識對象的一種機(jī)制;對對象存儲地址的抽象,但引用不是值;引用有類型;變量的別名;1、定義格式<類型>&<引用名>(<變量名>);或<類型>&<引用名>=<變量名>;2、初始化與賦值定義引用時必須初始化;可以將一個引用賦給某個變量;引用可被賦值;2.5.3引用標(biāo)識對象的一種機(jī)制;對對象存儲地址的抽象,但2.5.3引用(續(xù))示例:inta=3;int&m=a;intn=m;int*p=&m;m=m+5;3a8pm3n定義引用并初始化將引用賦值給變量a=8,對引用的操作就是對被引用者的操作3、引用的功能用做函數(shù)的參數(shù)或函數(shù)的返回值;函數(shù)不能返回對局部對象的引用;2.5.3引用(續(xù))示例:3a8pm3n定義引用并初始化將2.5.3引用(續(xù))示例:int&f(intindex,inta[]){intr=a[index];returnr;}錯,r是局部對象4、指針與引用的區(qū)別指針通過地址間接訪問某個變量,引用通過別名直接訪問某個變量;引用必須初始化,一旦被初始化后不得再作為其他變量的別名;正確:int&r=a[index];為什么?2.5.3引用(續(xù))示例:錯,r是局部對象4、指針與引用的2.5.3引用(續(xù))例2.4:分析下列程序的輸出結(jié)果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<refv<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}輸出1010102.5.3引用(續(xù))例2.4:分析下列程序的輸出結(jié)果。#i2.6.1算術(shù)運(yùn)算符1、普通算術(shù)運(yùn)算符單目算術(shù)運(yùn)算符:-(取負(fù))、+(取正);雙目算術(shù)運(yùn)算符:+、-、*、/、%(只用于int型);單目運(yùn)算符優(yōu)先級高于雙目運(yùn)算符;2、增1和減1運(yùn)算符單目運(yùn)算符:++、--;++運(yùn)算符的功能:由該運(yùn)算符組成的表達(dá)式具有一定的值;由該運(yùn)算符組成的表達(dá)式計算后,其變量值要發(fā)生改變;2.6.1算術(shù)運(yùn)算符1、普通算術(shù)運(yùn)算符單目算術(shù)運(yùn)算符:-(2.6.1算術(shù)運(yùn)算符(續(xù))++運(yùn)算符的兩種方式:前綴方式與后綴方式;前綴方式與后綴方式的區(qū)別:前綴運(yùn)算表達(dá)式的值為原來變量值加1;后綴運(yùn)算表達(dá)式的值為原來變量值;兩種方式的變量的值都加1;示例:inta(1);++a;intb(1);b++;表達(dá)式++a的值為2,變量a的值為2;表達(dá)式b++的值為1,變量b的值為2;2.6.1算術(shù)運(yùn)算符(續(xù))++運(yùn)算符的兩種方式:前綴方式與2.6.2關(guān)系運(yùn)算符雙目運(yùn)算符:>、<、>=、<=、==、!=前四種優(yōu)先級高于后兩種;2.6.2關(guān)系運(yùn)算符雙目運(yùn)算符:>、<、>=、<=、==、2.6.3邏輯運(yùn)算符雙目運(yùn)算符:&&、||優(yōu)先級:&&、||、!單目運(yùn)算符:!2.6.3邏輯運(yùn)算符雙目運(yùn)算符:&&、||優(yōu)先級:&&、|2.6.4位操作運(yùn)算符1、邏輯位運(yùn)算符單目邏輯位運(yùn)算符:~雙目邏輯位運(yùn)算符:&、|、^雙目邏輯位運(yùn)算符的優(yōu)先級:&、|、^;2、移位運(yùn)算符雙目運(yùn)算符:<<、>>;<<時移掉的位被丟棄,右邊移出的空位補(bǔ)0;>>時移掉的位被丟棄,左邊移出的空位補(bǔ)0或符號位;2.6.4位操作運(yùn)算符1、邏輯位運(yùn)算符單目邏輯位運(yùn)算符:~2.6.5賦值運(yùn)算符簡單賦值運(yùn)算符:=復(fù)合賦值運(yùn)算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=2.6.5賦值運(yùn)算符簡單賦值運(yùn)算符:=復(fù)合賦值運(yùn)算符:+=2.6.6其他運(yùn)算符1、三目運(yùn)算符格式:d1?d2:d3功能:先計算d1,若其非零,表達(dá)式的值為d2的值,否則為d3的值;表達(dá)式類型:d2和d3中類型較高者的類型;2、逗號運(yùn)算符格式:d1,d2,…,dn表達(dá)式的值和類型:由最后一個表達(dá)式確定;優(yōu)先級在所有運(yùn)算符中最低;3、sizeof運(yùn)算符2.6.6其他運(yùn)算符1、三目運(yùn)算符格式:d1?d2:d3功2.6.6其他運(yùn)算符(續(xù))格式:功能:返回其后的類型說明符或表達(dá)式所表示的數(shù)在內(nèi)存中所占的字節(jié);4、單目運(yùn)算符&和*&:取地址;*:用在指針名前,表示取指針的內(nèi)容;5、強(qiáng)制類型運(yùn)算符sizeof(<類型說明符>);或sizeof(<表達(dá)式>);格式:<類型說明符>(<表達(dá)式>);或(<類型說明符>)<表達(dá)式>;2.6.6其他運(yùn)算符(續(xù))格式:功能:返回其后的類型說明符2.6.6其他運(yùn)算符(續(xù))強(qiáng)制類型轉(zhuǎn)換可將高類型轉(zhuǎn)換為低類型,是一種不安全的轉(zhuǎn)換;示例:doublef(3.85);inth;h=int(f);該轉(zhuǎn)換是暫時的,一次性的;示例:inta(3),m;doubleb;b=3.56+double(a);m=a+5;2.6.6其他運(yùn)算符(續(xù))強(qiáng)制類型轉(zhuǎn)換可將高類型轉(zhuǎn)換為低類2.7.1表達(dá)式的種類由運(yùn)算符和操作數(shù)組成的式子;常見的表達(dá)式算術(shù)表達(dá)式;邏輯表達(dá)式;關(guān)系表達(dá)式;賦值表達(dá)式;條件表達(dá)式;逗號表達(dá)式;2.7.1表達(dá)式的種類由運(yùn)算符和操作數(shù)組成的式子;常見的表2.7.1表達(dá)式的種類(續(xù))注意事項:連續(xù)的兩個運(yùn)算符之間用空格分隔;可用括號來改變運(yùn)算符優(yōu)先級;雙目運(yùn)算符的左右可以用空格符和操作數(shù)分開;過長的表達(dá)式可分成幾個表達(dá)式;2.7.1表達(dá)式的種類(續(xù))注意事項:連續(xù)的兩個運(yùn)算符之間2.7.2表達(dá)式的值和類型一、確定表達(dá)式的值二、表達(dá)式求值方法與確定類型的方法先確定運(yùn)算符的功能;確定計算順序:先考慮優(yōu)先級,再考慮結(jié)合性;2.7.2表達(dá)式的值和類型一、確定表達(dá)式的值二、表達(dá)式求值2.7.2表達(dá)式的值和類型(續(xù))例2.6:分析下列程序的輸出結(jié)果(算術(shù)表達(dá)式)。#include<iostream.h>voidmain(){unsigneda(0xab),b(20);a&=b;a^=a;cout<<a<<"\t"<<b<<endl;intx(-3),y(5);x>>y;x<<=y;x|=y^~y;y&=~x+1;cout<<x<<"\t"<<y<<endl;}輸出:020-112.7.2表達(dá)式的值和類型(續(xù))例2.6:分析下列程序的輸2.7.2表達(dá)式的值和類型(續(xù))例2.7:分析下列程序的輸出結(jié)果(關(guān)系表達(dá)式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}輸出:1132.7.2表達(dá)式的值和類型(續(xù))例2.7:分析下列程序的輸2.7.2表達(dá)式的值和類型(續(xù))例2.8:分析下列程序的輸出結(jié)果(邏輯表達(dá)式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}輸出:011122212注意邏輯表達(dá)式的求值方法2.7.2表達(dá)式的值和類型(續(xù))例2.8:分析下列程序的輸2.7.2表達(dá)式的值和類型(續(xù))例2.9:分析下列程序的輸出結(jié)果(條件表達(dá)式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}3,5,53,5,8注意三目運(yùn)算符的判斷條件輸出2.7.2表達(dá)式的值和類型(續(xù))例2.9:分析下列程序的輸2.7.2表達(dá)式的值和類型(續(xù))例2.10:分析下列程序的輸出結(jié)果(賦值表達(dá)式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}輸出:10,9,3-10,-1,-74,6,122.7.2表達(dá)式的值和類型(續(xù))例2.10:分析下列程序的2.7.2表達(dá)式的值和類型(續(xù))例2.11:分析下列程序的輸出結(jié)果(逗號表達(dá)式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}1,2,64,2,6輸出2.7.2表達(dá)式的值和類型(續(xù))例2.11:分析下列程序的2.7.3表達(dá)式中的類型轉(zhuǎn)換一、隱含轉(zhuǎn)換雙目運(yùn)算中操作數(shù)的類型轉(zhuǎn)換;是一種保值轉(zhuǎn)換,轉(zhuǎn)換類型由低到高;轉(zhuǎn)換規(guī)則:intunsignedlongunsignedlongdoubleshort,charfloat二、強(qiáng)制轉(zhuǎn)換顯式強(qiáng)制轉(zhuǎn)換(通過強(qiáng)制轉(zhuǎn)換運(yùn)算符實現(xiàn));2.7.3表達(dá)式中的類型轉(zhuǎn)換一、隱含轉(zhuǎn)換雙目運(yùn)算中操作數(shù)的2.7.3表達(dá)式中的類型轉(zhuǎn)換(續(xù))隱式強(qiáng)制轉(zhuǎn)換:在賦值表達(dá)式中,當(dāng)左值(賦值運(yùn)算符左邊的值)和右值(賦值運(yùn)算符右邊的值)的類型不同時,一律將右值類型強(qiáng)制轉(zhuǎn)換為左值的類型;在函數(shù)有返回值的調(diào)用中,將return后面的表達(dá)式的類型強(qiáng)制轉(zhuǎn)換為該函數(shù)的類型;顯式隱式賦值表達(dá)式函數(shù)返回值隱含轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換類型轉(zhuǎn)換2.7.3表達(dá)式中的類型轉(zhuǎn)換(續(xù))隱式強(qiáng)制轉(zhuǎn)換:在賦值表達(dá)2.8類型定義1、格式typedef<已有類型名><新類型名表>;例如:typedefdoublewages,bouns;wagesweekly;bounsmonthly;2、自定義類型的作用改善程序的可讀性,增加所定義變量的信息書寫簡練提高程序的可移植性2.8類型定義1、格式typedef<已有類型名><新第3節(jié)預(yù)處理和語句3.1預(yù)處理功能3.2語句3.3選擇語句3.4循環(huán)語句3.5轉(zhuǎn)向語句第3節(jié)預(yù)處理和語句3.1預(yù)處理功能3.1預(yù)處理功能一、預(yù)處理命令及預(yù)處理功能1、預(yù)處理命令C++源程序中包含的各種編譯命令在程序被正常編譯之前執(zhí)行;預(yù)處理命令不是C++語言的一部分;2、預(yù)處理功能由預(yù)處理命令實現(xiàn)的功能;二、常用的預(yù)處理命令文件包含命令宏定義命令3.1預(yù)處理功能一、預(yù)處理命令及預(yù)處理功能1、預(yù)處理命令C3.1預(yù)處理功能(續(xù))以"#"為引導(dǎo);每條預(yù)處理命令單獨(dú)占用一行,同一行不能有其他預(yù)處理命令和語句;三、預(yù)處理命令使用說明條件編譯命令停止編譯命令預(yù)處理命令的位置可以放在開頭、中間和結(jié)尾;預(yù)處理命令可以續(xù)行,續(xù)行符為"\";預(yù)處理命令不是語句,不能以分號(;)結(jié)束;3.1預(yù)處理功能(續(xù))以"#"為引導(dǎo);每條預(yù)處理命令單3.1.1文件包含命令一、功能指示C++編譯器將一個文件(頭文件)的內(nèi)容嵌入到該指令所在的文件中該指令所在位置處;頭文件指存放與標(biāo)準(zhǔn)函數(shù)有關(guān)的信息,或者存放符號常量、類型定義、類和其他復(fù)雜類型的定義以及與程序環(huán)境相關(guān)信息的.h文件;二、格式#include
<文件名>由系統(tǒng)提供并放在指定子目錄中的頭文件;#include
"文件名"由用戶定義,放在當(dāng)前目錄或其他目錄下的頭文件或其他源文件;3.1.1文件包含命令一、功能指示C++編譯器將一個文件(3.1.1文件包含命令(續(xù))三、說明文件包含命令一般放在程序頭;一條文件包含命令只能包含一個文件;文件名:myfile.h#include"myfile2.h"#include"myfile3.h"文件包含命令可以嵌套;包含文件不易過多;3.1.1文件包含命令(續(xù))三、說明文件包含命令一般放在程3.1.2宏定義命令一、功能用來將一個標(biāo)識符定義為一個字符串,該標(biāo)識符稱為宏名,被定義的字符串稱為替換文本;二、宏定義命令格式1、兩種定義格式簡單宏定義帶參數(shù)的宏定義2、簡單宏定義定義符號常量,例如:#definePI3.1415#define<宏名><字符串>3.1.2宏定義命令一、功能用來將一個標(biāo)識符定義為一個3.1.2宏定義命令(續(xù))#define與const定義符號常量的區(qū)別const產(chǎn)生一個具有類型的符號#define僅產(chǎn)生文本替換,而不管內(nèi)容是否正確constdoublePI=3.1415;#definePI3.1415使用const可以定義一個局部常量,可局部在一個函數(shù)體內(nèi)用#define定義的常量的作用域是從定義時開始,直到使用#undef取消定義時為止,如果不取消定義,直到整個文件結(jié)束使用const定義常量是一個說明語句,用分號(;)結(jié)束使用#define定義常量是一個預(yù)處理命令,不能用分號(;)結(jié)束3.1.2宏定義命令(續(xù))#define與const定義符3.1.2宏定義命令(續(xù))說明書寫#define命令時,<宏名>與<字符串>之間用空格分隔,不能使用等號連接;使用#define定義的標(biāo)識符不是變量,它只用作宏替換,不占用內(nèi)存;#define是一條預(yù)處理命令,不用分號結(jié)束,它所定義的標(biāo)識符等價于其后的字符串;標(biāo)識符被宏定義后,在取消這次宏定義之前,不允許重新對它進(jìn)行宏定義;宏定義可以嵌套,已定義的標(biāo)識符可以用來定義新的字符串;3.1.2宏定義命令(續(xù))說明書寫#define命令時,<3.1.2宏定義命令(續(xù))說明<宏體>應(yīng)寫在一行上,如果需要寫在多行時,需使用續(xù)行符(\)結(jié)束,并在其后按下回車鍵;<宏名>與左括號之間不能出現(xiàn)空格,否則空格右邊都將作為宏體;定義帶參數(shù)的宏體時,宏體中與參數(shù)名相同的字符序列適當(dāng)?shù)丶由侠ㄌ?,可以避免宏替換后出現(xiàn)的優(yōu)先級問題;C++中,帶參數(shù)的宏定義常由內(nèi)聯(lián)函數(shù)取代;3、帶參數(shù)的宏定義#define<宏名>(<參數(shù)表>)<宏體>3.1.2宏定義命令(續(xù))說明<宏體>應(yīng)寫在一行上,如果需3.1.2宏定義命令(續(xù))例3.1:分析下列程序的輸出結(jié)果。#include<iostream.h>voidmain(){intb(5);#defineb2#definef(x)b*(x)inty(3);cout<<f(y+1)<<endl;#undefbcout<<f(y+1)<<endl;#defineb(3)cout<<f(y+1)<<endl;}輸出:82012簡單宏定義帶參數(shù)的宏定義b=2b=5b=33.1.2宏定義命令(續(xù))例3.1:分析下列程序的輸出結(jié)果3.1.2宏定義命令(續(xù))4、替換正文中的操作符##與###:將它兩邊的操作數(shù)連接成一個符號;#:將它右邊的操作數(shù)變成一個字符串文字;例如:#defineCON(a,b)a##bdoublei=CON(5,E-10)doublei=5E-10;#defineSTR(a)#acout<<STR(Programmingisfun!)<<endl;cout<<"Programmingisfun!"<<endl;5、取消宏定義命令#undef<標(biāo)識符>3.1.2宏定義命令(續(xù))4、替換正文中的操作符##與##3.1.3條件編譯命令一、功能用來定義某些編譯內(nèi)容要在滿足一定條件下才參與編譯,否則不參與編譯;可使同一源程序在不同的編譯條件下產(chǎn)生不同的目標(biāo)代碼。二、格式格式一:#ifdef<標(biāo)識符><程序段1>#else<程序段2>#endif或#ifdef<標(biāo)識符><程序段1>#endif3.1.3條件編譯命令一、功能用來定義某些編譯內(nèi)容要在3.1.3條件編譯命令(續(xù))格式二#ifndef<標(biāo)識符><程序段1>#else<程序段2>#endif或#ifndef<標(biāo)識符><程序段1>#endif格式三#if<常量表達(dá)式1><程序段1>#elif<常量表達(dá)式2><程序段2>#elif<常量表達(dá)式3><程序段3>...#else<程序段n+1>#endif3.1.3條件編譯命令(續(xù))格式二格式三3.1.3條件編譯命令(續(xù))例3.2:分析下列程序的輸出結(jié)果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}輸出:a>03.1.3條件編譯命令(續(xù))例3.2:分析下列程序的輸出結(jié)3.1.3條件編譯命令(續(xù))例3.3:避免重復(fù)引用某個頭文件。//main.cpp#include"myfile1.h"#include"myfile2.h"http://myfile1.h#include"myhead.h"http://myfile2.h#include"myhead.h"改進(jìn)://myfile1.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif//myfile2.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif3.1.3條件編譯命令(續(xù))例3.3:避免重復(fù)引用某個頭文3.1.3條件編譯命令(續(xù))例3.4:用于調(diào)試。調(diào)試時:#defineDEBUG1...#ifDEBUG=1cout<<"OK"<<endl;#endif...調(diào)試后:#defineDEBUG0...3.1.3條件編譯命令(續(xù))例3.4:用于調(diào)試。調(diào)試時:調(diào)3.1.4停止編譯命令一、格式#error<字符序列>二、功能當(dāng)編譯器遇到該指令時,顯示“字符序列”,即錯誤信息,然后停止對該程序的編譯,從而可以在編譯階段發(fā)現(xiàn)程序中的錯誤;三、示例假設(shè)country值為:US、ENGLAND、CHINA程序中有如下語句:3.1.4停止編譯命令一、格式#error<字符序列>二3.1.4停止編譯命令(續(xù))//…#else#errorYoudefinecountryincorrectly#endif當(dāng)country的值不是上述三者之一時,編譯器將顯示:然后停止編譯。Youdefinecountryincorrectly3.1.4停止編譯命令(續(xù))//…當(dāng)country的值3.2語句1、表達(dá)式語句和空語句表達(dá)式語句:任何一個表達(dá)式加上分號(;);空語句:只有一個分號(;)的語句;2、復(fù)合語句和分程序復(fù)合語句:由兩條或兩條以上的程序構(gòu)成,并由一對花括號括起;分程序:又稱塊結(jié)構(gòu),含有一條或多條說明語句的復(fù)合語句;3.2語句1、表達(dá)式語句和空語句表達(dá)式語句:任何一個表達(dá)式3.3.1條件語句if(<條件1>)<語句1>elseif(<條件2>)<語句2>elseif(<條件3>)<語句3>...elseif(<條件n>)<語句n>else<語句n+1>說明:if語句可以嵌套,在此情況下,else與最近的一個沒有與else配對的if配對。3.3.1條件語句if(<條件1>)<語句1>說3.3.2開關(guān)語句switch(<整型表達(dá)式>){case<整常型表達(dá)式1>:<語句序列1>case<整常型表達(dá)式2>:<語句序列2>...case<整常型表達(dá)式n>:<語句序列n>default<語句序列n+1>}注意:
在執(zhí)行語句序列中如果遇到break語句,則退出switch語句,執(zhí)行后面的語句;如果其后的語句序列中沒有break語句,則一直執(zhí)行至switch語句結(jié)束。3.3.2開關(guān)語句switch(<整型表達(dá)式>)注3.3.2開關(guān)語句(續(xù))例3.5:分析下列程序的輸出結(jié)果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}
輸出:4,53.3.2開關(guān)語句(續(xù))例3.5:分析下列程序的輸出結(jié)果。3.4循環(huán)語句1、while循環(huán)語句while(<條件>)<語句>;2、do-while循環(huán)語句do<語句>while(<條件>);do-while循環(huán)與while循環(huán)的區(qū)別:do-while循環(huán)至少執(zhí)行一次循環(huán)體,while循環(huán)可能一次也不執(zhí)行循環(huán)體;3、for循環(huán)語句for
(d1;d2;d3)<語句>;4、多重循環(huán)3.4循環(huán)語句1、while循環(huán)語句while(<條件>3.5轉(zhuǎn)向語句1、goto語句格式:goto<語句編號>;goto語句只能在一個函數(shù)內(nèi)進(jìn)行轉(zhuǎn)向;2、break語句格式:break;適用情況:用于開關(guān)語句的語句序列中,其功能是退出開關(guān)語句,執(zhí)行其后的語句;用于循環(huán)體中,其功能是用來退出該重循環(huán);3、continue語句格式:continue;功能:在循環(huán)體中用來結(jié)束本次循環(huán);3.5轉(zhuǎn)向語句1、goto語句格式:goto<語句編號第4章函數(shù)和作用域4.1函數(shù)的基本概念4.2函數(shù)的定義和說明4.3函數(shù)的調(diào)用4.4函數(shù)的參數(shù)4.5內(nèi)聯(lián)函數(shù)4.6函數(shù)重載4.7異常處理基礎(chǔ)4.8作用域第4章函數(shù)和作用域4.1函數(shù)的基本概念返回類型為void類型的函數(shù)抽象為過程抽象4.1函數(shù)的基本概念函數(shù)結(jié)構(gòu):由花括號括起來的一個語句序列;函數(shù)抽象:使用標(biāo)識符對語句序列進(jìn)行的抽象;函數(shù)調(diào)用:函數(shù)級上的控制抽象,一種控制轉(zhuǎn)移;參數(shù)化:在函數(shù)抽象中對其所操作的值進(jìn)行抽象的過程;形參與實參函數(shù)抽象與過程抽象函數(shù)抽象的目的是進(jìn)行求值過程抽象的目的是更新對象C++中只有函數(shù)抽象返回類型為4.1函數(shù)的基本概念函數(shù)結(jié)構(gòu):由花括號括起來的一4.2.1函數(shù)的定義格式<類型><函數(shù)名>(<參數(shù)表>){<若干條語句>}說明:<類型>為函數(shù)返回值類型,若為void,則為過程調(diào)用;<參數(shù)表>中的參數(shù)為形參,在函數(shù)被調(diào)用時進(jìn)行初始化,從而從被調(diào)用處獲得數(shù)據(jù);函數(shù)體4.2.1函數(shù)的定義格式<類型><函數(shù)名>(<參數(shù)4.2.2函數(shù)的說明方法(函數(shù)的聲明)一、函數(shù)的說明原則如果一個函數(shù)定義在先,調(diào)用在后,調(diào)用前可以不必說明;如果一個函數(shù)定義在后,調(diào)用在先,調(diào)用前必須說明;二、函數(shù)的說明方法(原型說明)<類型><函數(shù)名>(<參數(shù)表>);三、示例參數(shù)表中的參數(shù)名稱可以省略4.2.2函數(shù)的說明方法(函數(shù)的聲明)一、函數(shù)的說明原則如4.2.2函數(shù)的說明方法(續(xù))#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例4.1:分析下列程序的輸出結(jié)果。函數(shù)原型聲明4.2.2函數(shù)的說明方法(續(xù))#include<iost4.2.2函數(shù)的說明方法(續(xù))voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}Itisinmain. Itisbackinfun1.Itisinfun2.Itisbackinfun2.Itisinfun1.Itisbackinmain.Itisinfun3.輸出4.2.2函數(shù)的說明方法(續(xù))voidfun2()It4.3.1函數(shù)的值和類型說明:實參表的個數(shù)由形參決定,用來初始化實參,多個實參用逗號分隔;實參的個數(shù)與類型必須與形參的個數(shù)與類型完全一致;一、函數(shù)調(diào)用格式<函數(shù)名>(<實參表>);實參對形參的初始化按其位置進(jìn)行;4.3.1函數(shù)的值和類型說明:實參表的個數(shù)由形參決定,用來4.3.1函數(shù)的值和類型(續(xù))關(guān)于return語句的說明:有返回值的return語句可以返回一個表達(dá)式的值,從而實現(xiàn)函數(shù)之間的信息傳遞;無返回值的函數(shù)必須用void說明其返回類型;二、返回語句格式格式一:return<表達(dá)式>;格式二:return;4.3.1函數(shù)的值和類型(續(xù))關(guān)于return語句的說明:4.3.2函數(shù)的傳值調(diào)用一、傳值調(diào)用的分類二、傳值調(diào)用的實現(xiàn)機(jī)制和特點傳值調(diào)用:傳遞變量本身的值(數(shù)據(jù)值);傳址調(diào)用:傳遞變量的地址值;用法:調(diào)用函數(shù)的實參用常量、變量(數(shù)據(jù))值或表達(dá)式值,被調(diào)用函數(shù)的形參用變量;實現(xiàn)機(jī)制:系統(tǒng)將實參拷貝一個副本給形參(數(shù)據(jù)值);特點:形參值的改變不影響實參值;4.3.2函數(shù)的傳值調(diào)用一、傳值調(diào)用的分類二、傳值調(diào)用的實4.3.2函數(shù)的傳值調(diào)用(續(xù))#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例4.2:分析下列程序的輸出結(jié)果(傳值調(diào)用)。輸出:x=9,y=5a=5,b=94.3.2函數(shù)的傳值調(diào)用(續(xù))#include<iost4.3.3函數(shù)的傳址調(diào)用傳址調(diào)用的實現(xiàn)機(jī)制和特點用法:調(diào)用函數(shù)的實參用地址值,被調(diào)用函數(shù)的形參用指針;實現(xiàn)機(jī)制:讓形參的指針直接指向?qū)崊ⅲ惶攸c:可以通過改變形參所指向的變量值來影響實參值;4.3.3函數(shù)的傳址調(diào)用傳址調(diào)用的實現(xiàn)機(jī)制和特點用法:調(diào)用4.3.3函數(shù)的傳址調(diào)用(續(xù))#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;
*x=*y;
*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain(){inta(5),b(9);swap2(&a,&b);cout<<"a="<<a<<","<<"b="<<b<<endl;}輸出:x=9,y=5a=9,b=5例4.3:分析下列程序的輸出結(jié)果(傳址調(diào)用)。4.3.3函數(shù)的傳址調(diào)用(續(xù))#include<iost4.3.4函數(shù)的引用調(diào)用(C++特有)引用調(diào)用的實現(xiàn)機(jī)制和特點用法:調(diào)用函數(shù)的實參用變量名,被調(diào)用函數(shù)的形參用引用;實現(xiàn)機(jī)制:直接通過引用來改變實參的數(shù)據(jù)值;特點:起到傳址調(diào)用的作用,但比傳址調(diào)用更方便、更直接;4.3.4函數(shù)的引用調(diào)用(C++特有)引用調(diào)用的實現(xiàn)機(jī)制和4.3.4函數(shù)的引用調(diào)用(續(xù))#include<iostream.h>voidswap3(int&x,int&y){inttemp;temp=x;
x=y;
y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap3(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}輸出:x=9,y=5a=9,b=5例4.4:分析下列程序的輸出結(jié)果(引用調(diào)用)。4.3.4函數(shù)的引用調(diào)用(續(xù))#include<iost4.3.4函數(shù)的引用調(diào)用(續(xù))三種調(diào)用方式比較4.3.4函數(shù)的引用調(diào)用(續(xù))三種調(diào)用方式比較4.4.1函數(shù)參數(shù)的求值順序當(dāng)一個函數(shù)帶有多個參數(shù)時,C++語言沒有規(guī)定函數(shù)調(diào)用時實參的求值順序;編譯器根據(jù)對代碼進(jìn)行優(yōu)化的需要自行規(guī)定對實參的求值順序;在實參中注意不要使用帶有副作用的運(yùn)算符,此時可能產(chǎn)生二義性;例4.5:由于使用對參數(shù)求值順序不同的編譯器造成的二義性。4.4.1函數(shù)參數(shù)的求值順序當(dāng)一個函數(shù)帶有多個參數(shù)時,C+4.4.1函數(shù)參數(shù)的求值順序(續(xù))#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}產(chǎn)生二義性可能的結(jié)果(按照編譯器對實參求值順序不同):自左至右,兩個實參的值分別為5和11;自右至左,兩個實參的值分別為5和10;4.4.1函數(shù)參數(shù)的求值順序(續(xù))#include<io注意:函數(shù)參數(shù)求值順序與參數(shù)默認(rèn)值補(bǔ)足順序不同參數(shù)求值順序:由編譯器決定求值方向;參數(shù)默認(rèn)值補(bǔ)足順序:自左向右4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值C++中,在函數(shù)聲明或定義時可以為一個或多個參數(shù)指定缺省參數(shù)值;intadd(intx,inty=10);進(jìn)行函數(shù)調(diào)用時,若未指定足夠的實參,則編譯器將按從左向右的順序用函數(shù)聲明或定義中的缺省值來補(bǔ)足所缺少的實參;add(15);add(15,10);注意:4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值C++中,在函數(shù)聲明或4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))在一個指定了缺省值的參數(shù)的右邊,不能出現(xiàn)沒有指定缺省值的參數(shù);voidf(intx,inty=1,intz);在給某個參數(shù)指定缺省值時,不僅可以是一個數(shù)值,而且可以是任意復(fù)雜的表達(dá)式;intf();……voiddelay(intk,inttime=f());錯誤例如:f(2,4);理想:f(2,1,4),實際:z參數(shù)未被賦值4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))在一個指定了缺省值的參4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}輸出:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!例4.6:分析下列程序的輸出結(jié)果。4.4.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))#include<i普通函數(shù)內(nèi)聯(lián)函數(shù)4.5.1內(nèi)聯(lián)函數(shù)引入的原因目的
解決程序中一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)的函數(shù)調(diào)用的效率問題。解決方法以目標(biāo)代碼的增加為代價來換取時間上的節(jié)??;即在編譯時將函數(shù)體中的代碼替換到程序中,增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,從而在時間開銷上不像函數(shù)調(diào)用時那么大。普通函數(shù)內(nèi)聯(lián)函數(shù)4.5.1內(nèi)聯(lián)函數(shù)引入的原因目的解決程4.5.2內(nèi)聯(lián)函數(shù)的定義方法在函數(shù)定義的前面加上關(guān)鍵字inline
inlineintadd(intx,inty,intz){returnx+y+z;}4.5.2內(nèi)聯(lián)函數(shù)的定義方法在函數(shù)定義的前面加上關(guān)鍵字in4.5.3使用內(nèi)聯(lián)函數(shù)的注意事項在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句或開關(guān)語句;內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在該內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前;類結(jié)構(gòu)中所有在類說明內(nèi)部定義的函數(shù)都是內(nèi)聯(lián)函數(shù);對內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口說明;內(nèi)聯(lián)函數(shù)無法遞歸調(diào)用;內(nèi)聯(lián)函數(shù)具有與帶參數(shù)的宏定義#define相同的作用和相似的機(jī)理,但內(nèi)聯(lián)函數(shù)具有宏定義的所有優(yōu)點而沒有其缺點,它消除了宏定義的不安全性。
4.5.3使用內(nèi)聯(lián)函數(shù)的注意事項在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語include<iostream.h>#definef(x)x*x
voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序運(yùn)行結(jié)果:45原因:f(x) 替換為2*2f(x+1) 替換為2+1*2+1include<iostream.h>inlineintf(intx){ returnx*x;}voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序運(yùn)行結(jié)果:49原因:f(x) 替換為 2*2f(x+1) 替換為 3*34.5.3使用內(nèi)聯(lián)函數(shù)的注意事項include<iostream.h>include<i4.6函數(shù)重載函數(shù)重載是指同一個函數(shù)名可以對應(yīng)著多個函數(shù)的實現(xiàn);要求:編譯器能夠唯一確定調(diào)用一個函數(shù)時應(yīng)執(zhí)行哪個函數(shù)代碼;條件:參數(shù)個數(shù)不同;參數(shù)類型不同;注意:
返回值類型不能作為重載條件;4.6函數(shù)重載函數(shù)重載是指同一個函數(shù)名可以對應(yīng)著多個函數(shù)的4.6.1參數(shù)類型不同的重載函數(shù)#include<iostream.h>intadd(int,int);doubleadd(double,double);voidmain(){cout<<add(5,10)<<endl;cout<<add(5.0,10.5)<<endl;}intadd(intx,inty){cout<<"int"<<endl;returnx+y;}例4.7:分析下列程序的輸出結(jié)果。兩個add函數(shù)的參數(shù)類型不同4.6.1參數(shù)類型不同的重載函數(shù)#include<ios4.6.1參數(shù)類型不同的重載函數(shù)(續(xù))doubleadd(doublex,doubley){cout<<"double"<<endl;returnx+y;}輸出int15double15.54.6.1參數(shù)類型不同的重載函數(shù)(續(xù))doubleadd4.6.2參數(shù)個數(shù)不同的重載函數(shù)#include<iostream.h>intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);voidmain(){cout<<min(13,5,4,9)<<endl;cout<<min(-2,8,0)<<endl;}intmin(inta,intb){returna<b?a:b;}例4.8:分析下列程序的輸出結(jié)果。三個min函數(shù)的參數(shù)個數(shù)不同4.6.2參數(shù)個數(shù)不同的重載函數(shù)#include<ios4.6.2參數(shù)個數(shù)不同的重載函數(shù)(續(xù))intmin(inta,intb,intc){intt=min(a,b);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 普通述職報告
- 新應(yīng)急預(yù)案編制
- 保護(hù)家庭網(wǎng)絡(luò)安全的方法
- 股票實戰(zhàn)課件教學(xué)課件
- 交通安全人人有責(zé)
- DB1304T 492-2024農(nóng)村消防設(shè)施管理指南
- 傳媒經(jīng)營管理
- 校園艾滋病健康
- 初中引體向上教案
- 菱形的性質(zhì)說課稿
- 教師專業(yè)發(fā)展的文化自覺
- 2023年大西北游考察報告
- 幼兒行為觀察與指導(dǎo):日記描述法
- 路燈工程施工勞務(wù)清包合同
- 人行道透水磚施工解決方案2445
- 2023年高考浙江卷英語試題(2023年1月考試-含聽力音頻、聽力原文和答案)
- 五年級上冊數(shù)學(xué)蘇教版課件第1課時 用列舉法解決問題-教案
- 中國歷史文選第四單元 典志體政書、詔令奏議
- YC/T 11.4-2006煙草機(jī)械產(chǎn)品圖樣及設(shè)計文件第4部分:編號原則
- RB/T 047-2020檢驗檢測機(jī)構(gòu)管理和技術(shù)能力評價設(shè)施和環(huán)境通用要求
- 食品安全保障措施方案
評論
0/150
提交評論