傳智播客-C++基礎(chǔ)課程講義_第1頁
傳智播客-C++基礎(chǔ)課程講義_第2頁
傳智播客-C++基礎(chǔ)課程講義_第3頁
傳智播客-C++基礎(chǔ)課程講義_第4頁
傳智播客-C++基礎(chǔ)課程講義_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上傳智播客C+課程講義 傳智掃地僧1、C+對C的擴(kuò)展1簡單的C+程序1.1求圓的周長和面積 數(shù)據(jù)描述:半徑,周長,面積均用實(shí)型數(shù)表示數(shù)據(jù)處理:輸入半徑 r;計(jì)算周長 = 2*r ;計(jì)算面積 = * r2 ;輸出半徑,周長,面積;方法1:用結(jié)構(gòu)化方法編程,求圓的周長和面積 / count the girth and area of circle#includeusing name std;void main () double r, girth, area ; const double PI = 3.1415 ; cout r ; /輸入 girth = 2 * PI *

2、 r ; area = PI * r * r ; cout radius = r endl ; cout girth = girth endl ; cout area = area endl ;方法2:用面向?qū)ο蠓椒ň幊?,求圓的周長和面積#include using name std;class Circle double radius ; /成員變量 public : /類的訪問控制 void Set_Radius( double r ) radius = r ; /成員函數(shù) double Get_Radius() return radius ; /通過成員函數(shù)設(shè)置成員變量 double G

3、et_Girth() return 2 * 3.14f * radius ; /通過成員函數(shù)獲取成員變量 double Get_Area() return 3.14f * radius * radius ; ;void main() Circle A, B ; /用類定義對象 A.Set_Radius( 6.23 ) ; /類的調(diào)用 cout A.Radius = A.Get_Radius() endl ; cout A.Girth = A.Get_Girth() endl ; cout A.Area = A.Get_Area() endl ; B.Set_Radius( 10.5 ) ; c

4、out B.radius = B.Get_Radius() endl ; cout B.Girth= B.Get_Girth() endl ; cout B.Area = B.Get_Area() endl ; 總結(jié):建立類、對象、成員變量、成員函數(shù),輸入輸入流基本概念。1.2初學(xué)者易犯錯(cuò)誤模型/ demo02_circle_err.cpp#includeusing namespace std;/c+的命名空間class circlepublic:double r;double pi = 3.;double area = pi*r*r;int main()circle pi;cout 請輸入a

5、rea pi.r;cout pi.area endl;/亂碼system(pause);return 0;總結(jié):從內(nèi)存四區(qū)的角度,解釋為什么會出現(xiàn)亂碼理解為什么需要成員函數(shù)2程序設(shè)計(jì)方法的發(fā)展歷程面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法 l 設(shè)計(jì)思路 自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。l 程序結(jié)構(gòu): 按功能劃分為若干個(gè)基本模塊,形成一個(gè)樹狀結(jié)構(gòu)。 各模塊間的關(guān)系盡可能簡單,功能上相對獨(dú)立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成。 其模塊化實(shí)現(xiàn)的具體方法是使用子程序。l 優(yōu)點(diǎn):有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子任務(wù),便于開發(fā)和維護(hù)。l

6、缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件 把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨(dú)立的實(shí)體。 當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改。 每一種相對于老問題的新方法都要帶來額外的開銷。 圖形用戶界面的應(yīng)用程序,很難用過程來描述和實(shí)現(xiàn),開發(fā)和維護(hù)也都很困難。面向?qū)ο蟮姆椒?l 將數(shù)據(jù)及對數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體對象。l 對同類型對象抽象出其共性,形成類。l 類通過一個(gè)簡單的外部接口,與外界發(fā)生關(guān)系。l 對象與對象之間通過消息進(jìn)行通信。面向?qū)ο蟮幕靖拍?對象l 一般意義上的對象: 是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物。 可以是有形的

7、(比如一輛汽車),也可以是無形的(比如一項(xiàng)計(jì)劃)。 是構(gòu)成世界的一個(gè)獨(dú)立單位,具有l(wèi) 靜態(tài)特征:可以用某種數(shù)據(jù)來描述l 動態(tài)特征:對象所表現(xiàn)的行為或具有的功能l 面向?qū)ο蠓椒ㄖ械膶ο螅?是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是用來構(gòu)成系統(tǒng)的一個(gè)基本單位。對象由一組屬性和一組行為構(gòu)成。 屬性:用來描述對象靜態(tài)特征的數(shù)據(jù)項(xiàng)。 行為:用來描述對象動態(tài)特征的操作序列。類 l 分類人類通常的思維方法l 分類所依據(jù)的原則抽象 忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。 例如,石頭、樹木、汽車、房屋等都是人們在長期的生產(chǎn)

8、和生活實(shí)踐中抽象出的概念。l 面向?qū)ο蠓椒ㄖ械念?具有相同屬性和服務(wù)的一組對象的集合 為屬于該類的全部對象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。 類與對象的關(guān)系:猶如模具與鑄件之間的關(guān)系,一個(gè)屬于某類的對象稱為該類的一個(gè)實(shí)例。封裝 也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。l 把對象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單元。l 盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。對外形成一個(gè)邊界(或者說一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。l 繼承對于軟件復(fù)用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟件開發(fā)效率的重要原因之一。l 定義:特

9、殊類的對象擁有其一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承。l 例如:將輪船作為一個(gè)一般類,客輪便是一個(gè)特殊類。多態(tài) 多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在一般類及其各個(gè)特殊類中具有不同的語義。面向?qū)ο蟮能浖こ?l 面向?qū)ο蟮能浖こ淌敲嫦驅(qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用。它包括: 面向?qū)ο蟮姆治觯∣OA) 面向?qū)ο蟮脑O(shè)計(jì)(OOD) 面向?qū)ο蟮木幊蹋∣OP) 面向?qū)ο蟮臏y試(OOT) 面向?qū)ο蟮能浖S護(hù)(OOSM)總結(jié):面向過程程序設(shè)計(jì):數(shù)據(jù)結(jié)構(gòu) + 算法主要解決科學(xué)計(jì)算問題,用戶需求簡單而固定特點(diǎn):分析

10、解決問題所需要的步驟利用函數(shù)實(shí)現(xiàn)各個(gè)步驟依次調(diào)用函數(shù)解決問題問題:軟件可重用性差軟件可維護(hù)性差構(gòu)建的軟件無法滿足用戶需求面向?qū)ο蟪绦蛟O(shè)計(jì):由現(xiàn)實(shí)世界建立軟件模型將現(xiàn)實(shí)世界中的事物直接映射到程序中,可直接滿足用戶需求特點(diǎn):直接分析用戶需求中涉及的各個(gè)實(shí)體在代碼中描述現(xiàn)實(shí)世界中的實(shí)體在代碼中關(guān)聯(lián)各個(gè)實(shí)體協(xié)同工作解決問題優(yōu)勢:構(gòu)建的軟件能夠適應(yīng)用戶需求的不斷變化直接利用面向過程方法的優(yōu)勢而避開其劣勢3 C語言和C+語言關(guān)系C語言是在實(shí)踐的過程中逐步完善起來的沒有深思熟慮的設(shè)計(jì)過程使用時(shí)存在很多“灰色地帶” 殘留量過多低級語言的特征 直接利用指針進(jìn)行內(nèi)存操作C語言的目標(biāo)是高效最終程序執(zhí)行效率的高效當(dāng)面

11、向過程方法論暴露越來越多的缺陷的時(shí)候,業(yè)界開始考慮在工程項(xiàng)目中引入面向?qū)ο蟮脑O(shè)計(jì)方法,而第一個(gè)需要解決的問題就是:高效的面向?qū)ο笳Z言,并且能夠兼容已經(jīng)存在的代碼。C語言 + 面向?qū)ο蠓椒ㄕ?Objective C /C+C語言和C+并不是對立的競爭關(guān)系C+是C語言的加強(qiáng),是一種更好的C語言C+是以C語言為基礎(chǔ)的,并且完全兼容C語言的特性學(xué)習(xí)C+并不會影響原有的C語言知識,相反會根據(jù)加深對C的認(rèn)知;學(xué)習(xí)C+可以接觸到更多的軟件設(shè)計(jì)方法,并帶來更多的機(jī)會。1) C+是一種更強(qiáng)大的C,通過學(xué)習(xí)C+能夠掌握更多的軟件設(shè)計(jì)方法2) C+是Java/C#/D等現(xiàn)代開發(fā)語言的基礎(chǔ),學(xué)習(xí)C+后能夠快速掌握這些

12、語言3)C+是各大知名軟件企業(yè)挑選人才的標(biāo)準(zhǔn)之一 4 C+對C的加強(qiáng)4.1 namespace命名空間1 C+命名空間基本常識所謂namespace,是指標(biāo)識符的各種可見范圍。C+標(biāo)準(zhǔn)程序庫中的所有標(biāo)識符都被定義于一個(gè)名為std的namespace中。一 :和格式不一樣,前者沒有后綴,實(shí)際上,在你的編譯器include文件夾里面可以看到,二者是兩個(gè)文件,打開文件就會發(fā)現(xiàn),里面的代碼是不一樣的。后綴為.h的頭文件c+標(biāo)準(zhǔn)已經(jīng)明確提出不支持了,早些的實(shí)現(xiàn)將標(biāo)準(zhǔn)庫功能定義在全局空間里,聲明在帶.h后綴的頭文件里,c+標(biāo)準(zhǔn)為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定頭文件不使用后綴.h。 因此,1)當(dāng)

13、使用時(shí),相當(dāng)于在c中調(diào)用庫函數(shù),使用的是全局命名空間,也就是早期的c+實(shí)現(xiàn);2)當(dāng)使用的時(shí)候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。二: 由于namespace的概念,使用C+標(biāo)準(zhǔn)程序庫的任何標(biāo)識符時(shí),可以有三種選擇:1、直接指定標(biāo)識符。例如std:ostream而不是ostream。完整語句如下: std:cout std:hex 3.4 std:endl;2、使用using關(guān)鍵字。 using std:cout; using std:endl; using std:cin; 以上程序可以寫成 cout std:hex 3.4 endl;

14、3、最方便的就是使用using namespace std; 例如: using namespace std;這樣命名空間std內(nèi)定義的所有標(biāo)識符都有效(曝光)。就好像它們被聲明為全局變量一樣。那么以上語句可以如下寫: cout hex 3.4 endl;因?yàn)闃?biāo)準(zhǔn)庫非常的龐大,所以程序員在選擇的類的名稱或函數(shù)名 時(shí)就很有可能和標(biāo)準(zhǔn)庫中的某個(gè)名字相同。所以為了避免這種情況所造成的名字沖突,就把標(biāo)準(zhǔn)庫中的一切都被放在名字空間std中。但這又會帶來了一個(gè)新問 題。無數(shù)原有的C+代碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫中的功能,他們都是在全局空間下的。所以就有了 和等等這樣的頭文件,一個(gè)是為了兼容以前的C+代

15、碼,一個(gè)是為了支持新的標(biāo)準(zhǔn)。命名空間std封裝的是標(biāo)準(zhǔn)程序庫的名稱,標(biāo)準(zhǔn)程序庫為了和以前的頭文件區(qū)別,一般不加.h2 C+命名空間定義及使用語法/*在C+中,名稱(name)可以是符號常量、變量、宏、函數(shù)、結(jié)構(gòu)、枚舉、類和對象等等。為了避免,在大規(guī)模程序的設(shè)計(jì)中,以及在程序員使用各種各樣的C+庫時(shí),這些標(biāo)識符的命名發(fā)生沖突,標(biāo)準(zhǔn)C+引入了關(guān)鍵字namespace(命名空間/名字空間/名稱空間/名域),可以更好地控制標(biāo)識符的作用域。*/*std是c+標(biāo)準(zhǔn)命名空間,c+標(biāo)準(zhǔn)程序庫中的所有標(biāo)識符都被定義在std中,比如標(biāo)準(zhǔn)庫中的類iostream、vector等都定義在該命名空間中,使用時(shí)要加上us

16、ing聲明(using namespace std) 或using指示(如std:string、std:vector).*/*C中的命名空間在C語言中只有一個(gè)全局作用域C語言中所有的全局標(biāo)識符共享同一個(gè)作用域標(biāo)識符之間可能發(fā)生沖突 C+中提出了命名空間的概念命名空間將全局作用域分成不同的部分不同命名空間中的標(biāo)識符可以同名而不會發(fā)生沖突命名空間可以相互嵌套全局作用域也叫默認(rèn)命名空間*/*C+命名空間的定義:namespace name */*C+命名空間的使用:使用整個(gè)命名空間:using namespace name;使用命名空間中的變量:using name:variable;使用默認(rèn)命名空

17、間中的變量::variable默認(rèn)情況下可以直接使用默 認(rèn)命名空間中的所有標(biāo)識符*/3 C+命名空間編程實(shí)踐namespace NameSpaceAint a = 0;namespace NameSpaceBint a = 1;namespace NameSpaceCstruct Teacherchar name10;int age;int main()using namespace NameSpaceA;using NameSpaceB:NameSpaceC:Teacher;printf(a = %dn, a);printf(a = %dn, NameSpaceB:a);NameSpaceB

18、:NameSpaceC:Teacher t2Teacher t1 = aaa, 3;printf( = %sn, );printf(t1.age = %dn, t1.age);system(pause);return 0;4 結(jié)論1) 當(dāng)使用的時(shí)候,該沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。若不引入using namespace std ,需要這樣做。std:cout。2) c+標(biāo)準(zhǔn)為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定不使用后綴.h。3) C+命名空間的定義:namespace name 4) using name

19、space NameSpaceA;5) namespce定義可嵌套。4.2 “實(shí)用性”增加#include iostreamusing namespace std;/C語言中的變量都必須在作用域開始的位置定義!/C+中更強(qiáng)調(diào)語言的“實(shí)用性”,所有的變量都可以在需要使用時(shí)再定義。int main11()int i = 0;printf(ddd);int k;system(pause);return 0;4.3 register關(guān)鍵字增強(qiáng) /register關(guān)鍵字 請求編譯器讓變量a直接放在寄存器里面,速度快/在c語言中 register修飾的變量 不能取地址,但是在c+里面做了內(nèi)容/*/1reg

20、ister關(guān)鍵字的變化register關(guān)鍵字請求“編譯器”將局部變量存儲于寄存器中C語言中無法取得register變量地址在C+中依然支持register關(guān)鍵字C+編譯器有自己的優(yōu)化方式,不使用register也可能做優(yōu)化C+中可以取得register變量的地址/2C+編譯器發(fā)現(xiàn)程序中需要取register變量的地址時(shí),register對變量的聲明變得無效。/3早期C語言編譯器不會對代碼進(jìn)行優(yōu)化,因此register變量是一個(gè)很好的補(bǔ)充。*/int main22()register int a = 0; printf(&a = %xn, &a);system(pause);return 0;其

21、他補(bǔ)充:請閱讀register關(guān)鍵字常識課外閱讀.docx4.4變量檢測增強(qiáng)/*在C語言中,重復(fù)定義多個(gè)同名的全局變量是合法的在C+中,不允許定義多個(gè)同名的全局變量C語言中多個(gè)同名的全局變量最終會被鏈接到全局?jǐn)?shù)據(jù)區(qū)的同一個(gè)地址空間上int g_var;int g_var = 1;C+直接拒絕這種二義性的做法。*/int main(int argc, char *argv)printf(g_var = %dn, g_var);return 0;4.5 struct類型加強(qiáng) struct類型的加強(qiáng):C語言的struct定義了一組變量的集合,C編譯器并不認(rèn)為這是一種新的類型C+中的struct是一個(gè)

22、新類型的定義聲明struct Student char name100; int age;int main(int argc, char *argv) Student s1 = wang, 1; Student s2 = wang2, 2; return 0;4.6 C+中所有的變量和函數(shù)都必須有類型/*C+中所有的變量和函數(shù)都必須有類型C語言中的默認(rèn)類型在C+中是不合法的函數(shù)f的返回值是什么類型,參數(shù)又是什么類型?函數(shù)g可以接受多少個(gè)參數(shù)?*/更換成.cpp試試f(i)printf(i = %dn, i);g()return 5;int main(int argc, char *argv)f

23、(10);printf(g() = %dn, g(1, 2, 3, 4, 5);getchar();return 0;總結(jié):/*在C語言中int f( );表示返回值為int,接受任意參數(shù)的函數(shù)int f(void);表示返回值為int的無參函數(shù)在C+中int f( );和int f(void)具有相同的意義,都表示返回值為int的無參函數(shù)*/C+更加強(qiáng)調(diào)類型,任意的程序元素都必須顯示指明類型4.2-4.6屬于語法級別的增強(qiáng)。4.7新增Bool類型關(guān)鍵字 /*C+中的布爾類型C+在C語言的基本類型系統(tǒng)之上增加了boolC+中的bool可取的值只有true和false理論上bool只占用一個(gè)字節(jié)

24、,如果多個(gè)bool變量定義在一起,可能會各占一個(gè)bit,這取決于編譯器的實(shí)現(xiàn)true代表真值,編譯器內(nèi)部用1來表示false代表非真值,編譯器內(nèi)部用0來表示bool類型只有true(非0)和false(0)兩個(gè)值C+編譯器會在賦值時(shí)將非0值轉(zhuǎn)換為true,0值轉(zhuǎn)換為false*/int main(int argc, char *argv)int a;bool b = true;printf(b = %d, sizeof(b) = %dn, b, sizeof(b);b = 4;a = b;printf(a = %d, b = %dn, a, b);b = -4;a = b;printf(a =

25、 %d, b = %dn, a, b);a = 10;b = a;printf(a = %d, b = %dn, a, b);b = 0;printf(b = %dn, b);system(pause);return 0;4.8三目運(yùn)算符功能增強(qiáng)1三目運(yùn)算符在C和C+編譯器的表現(xiàn) int main()int a = 10;int b = 20;/返回一個(gè)最小數(shù) 并且給最小數(shù)賦值成3/三目運(yùn)算符是一個(gè)表達(dá)式 ,表達(dá)式不可能做左值(a b ? a : b )= 30;printf(a = %d, b = %dn, a, b); system(pause);return 0;2結(jié)論 1)C語言返回變

26、量的值 C+語言是返回變量本身C語言中的三目運(yùn)算符返回的是變量值,不能作為左值使用C+中的三目運(yùn)算符可直接返回變量本身,因此可以出現(xiàn)在程序的任何地方2)注意:三目運(yùn)算符可能返回的值中如果有一個(gè)是常量值,則不能作為左值使用(a 當(dāng)左值的條件:要有內(nèi)存空間;C+編譯器幫助程序員取了一個(gè)地址而已思考:如何讓C中的三目運(yùn)算法當(dāng)左值呢?5 C/C+中的const 1 const基礎(chǔ)知識(用法、含義、好處)int main()const int a;int const b;const int *c;int * const d;const int * const e ;return 0;Int func1(

27、const )初級理解:const是定義常量=const意味著只讀含義:/第一個(gè)第二個(gè)意思一樣 代表一個(gè)常整形數(shù)/第三個(gè) c是一個(gè)指向常整形數(shù)的指針(所指向的內(nèi)存數(shù)據(jù)不能被修改,但是本身可以修改)/第四個(gè) d 常指針(指針變量不能被修改,但是它所指向內(nèi)存空間可以被修改)/第五個(gè) e一個(gè)指向常整形的常指針(指針和它所指向的內(nèi)存空間,均不能被修改)Const好處/合理的利用const,/1指針做函數(shù)參數(shù),可以有效的提高代碼可讀性,減少bug;/2清楚的分清參數(shù)的輸入和輸出特性int setTeacher_err( const Teacher *p)Const修改形參的時(shí)候,在利用形參不能修改指針?biāo)?/p>

28、向的內(nèi)存空間2 C中“冒牌貨”int main()const int a = 10;int *p = (int*)&a; printf(a=%dn, a);*p = 11;printf(a=%dn, a);printf(Hello.n);return 0;解釋:C+編譯器對const常量的處理當(dāng)碰見常量聲明時(shí),在符號表中放入常量 =問題:那有如何解釋取地址編譯過程中若發(fā)現(xiàn)使用常量則直接以符號表中的值替換編譯過程中若發(fā)現(xiàn)對const使用了extern或者&操作符,則給對應(yīng)的常量分配存儲空間(兼容C)?聯(lián)想: int &a = 1(err) & const int &a = 10(ok)? C+中

29、const符號表原理圖注意:C+編譯器雖然可能為const常量分配空間,但不會使用其存儲空間中的值。結(jié)論:C語言中的const變量C語言中const變量是只讀變量,有自己的存儲空間C+中的const常量可能分配存儲空間,也可能不分配存儲空間 當(dāng)const常量為全局,并且需要在其它文件中使用當(dāng)使用&操作符取const常量的地址3 const和#define相同之處/練習(xí) 解釋為什么/#define N 10 int main() const int a = 1; const int b = 2; int arraya + b = 0; int i = 0; for(i=0; i(a+b); i+

30、) printf(array%d = %dn, i, arrayi); getchar(); return 0;C+中的const修飾的,是一個(gè)真正的常量,而不是C中變量(只讀)。在const修飾的常量編譯期間,就已經(jīng)確定下來了。4 const和#define的區(qū)別 對比加深C+中的const常量類似于宏定義const int c = 5; #define c 5C+中的const常量與宏定義不同const常量是由編譯器處理的,提供類型檢查和作用域檢查 宏定義由預(yù)處理器處理,單純的文本替換/在func1定義a,在func2中能使用嗎?/在func1中定義的b,在func2中能使用嗎?練習(xí)voi

31、d fun1() #define a 10 const int b = 20; /#undef a # undefvoid fun2() printf(a = %dn, a); /printf(b = %dn, b);int main() fun1(); fun2(); return 0;5 結(jié)論C語言中的const變量C語言中const變量是只讀變量,有自己的存儲空間C+中的const常量可能分配存儲空間,也可能不分配存儲空間 當(dāng)const常量為全局,并且需要在其它文件中使用,會分配存儲空間當(dāng)使用&操作符,取const常量的地址時(shí),會分配存儲空間當(dāng)const int &a = 10; con

32、st修飾引用時(shí),也會分配存儲空間6引用專題講座1引用(普通引用)變量名回顧變量名實(shí)質(zhì)上是一段連續(xù)存儲空間的別名,是一個(gè)標(biāo)號(門牌號) 程序中通過變量來申請并命名內(nèi)存空間 通過變量的名字可以使用存儲空間問題1:對一段連續(xù)的內(nèi)存空間只能取一個(gè)別名嗎?1 引用概念a) 在C+中新增加了引用的概念b) 引用可以看作一個(gè)已定義變量的別名c) 引用的語法:Type& name = var; d) 引用做函數(shù)參數(shù)那?(引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化)void main01()int a = 10; /c編譯器分配4個(gè)字節(jié)內(nèi)存。a內(nèi)存空間的別名int &b = a; /b就是a的別名。a =11; /直接

33、賦值int *p = &a;*p = 12;printf(a %d n,a);b = 14; printf(a:%d b:%d, a, b);system(pause);2 引用是C+的概念 屬于C+編譯器對C的擴(kuò)展問題:C中可以編譯通過嗎?int main()int a = 0;int &b = a; /int * const b = &a b = 11; /*b = 11;return 0;結(jié)論:請不要用C的語法考慮 b=113 引用做函數(shù)參數(shù) 普通引用在聲明時(shí)必須用其它的變量進(jìn)行初始化,引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化/05復(fù)雜數(shù)據(jù)類型 的引用struct Teacherchar na

34、me64;int age ;void printfT(Teacher *pT)coutageendl;/pT是t1的別名 ,相當(dāng)于修改了t1void printfT2(Teacher &pT)/coutpT.ageendl;pT.age = 33;/pT和t1的是兩個(gè)不同的變量void printfT3(Teacher pT)coutpT.age pT = t1printf(t1.age:%d n, t1.age); /35couthello.endl; system(pause);return ;4 引用的意義 1)引用作為其它變量的別名而存在,因此在一些場合可以代替指針2)引用相對于指針來

35、說具有更好的可讀性和實(shí)用性5 引用本質(zhì)思考思考1:C+編譯器背后做了什么工作?int main() int a = 10;int &b = a;/b是a的別名,請問c+編譯器后面做了什么工作?b = 11;coutab?&a:&b) = 111;/當(dāng)被調(diào)用的函數(shù)當(dāng)左值的時(shí)候,必須返回一個(gè)引用。j1() = 100; /編譯器幫我們打造了環(huán)境j1();*(j2() = 200; /相當(dāng)于我們程序員手工的打造 做左值的條件j2();system(pause);返回值是形參,當(dāng)引用int g1(int *p)*p = 100;return *p;int& g2(int *p) /*p = 100;r

36、eturn *p;/當(dāng)我們使用引用語法的時(shí)候 ,我們不去關(guān)心編譯器引用是怎么做的/當(dāng)我們分析亂碼這種現(xiàn)象的時(shí)候,我們才去考慮c+編譯器是怎么做的。void main23()int a1 = 10;a1 = g2(&a1);int &a2 = g2(&a1); /用引用去接受函數(shù)的返回值,是不是亂碼,關(guān)鍵是看返回的內(nèi)存空間是不是被編譯器回收了。printf(a1:%d n, a1);printf(a2:%d n, a2);system(pause);返回值非基礎(chǔ)類型 struct Teacharchar name64;int age;/如果返回引用不是基礎(chǔ)類型,是一個(gè)類,那么情況非常賦值。涉及到

37、copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teacharchar name64;int age;/如果返回引用不是基礎(chǔ)類型,是一個(gè)類,那么情況非常賦值。涉及到copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teachar & OpTeacher(struct Teachar &t1)9指針引用 #include iostreamusing namespace std;struct Teacherchar name64;int age;int getTe(Teacher *myp )Teacher *p = (Teacher *)malloc(sizeof(Teacher);if (p

38、 =NULL)return -1;memset(p, 0, sizeof(Teacher);p-age = 33;*myp = p; /return 0;/指針的引用而已int getTe2(Teacher* &myp)myp = (Teacher *)malloc(sizeof(Teacher);myp-age = 34;return 0;void main333()Teacher *p = NULL;/getTe(&p);getTe2(p);printf(age:%d n, p-age);system(pause);2常引用下面開始進(jìn)入const引用難點(diǎn)1 使用變量初始化const引用 思

39、考cost int &a = b PK const int &a = 10;?問題:const引用,在C+中可以聲明const引用const Type& name = var;const引用讓變量擁有只讀屬性 案例1:int main()int a = 10;const int &b = a; /int *p = (int *)&b;b = 11; /err/*p = 11; /只能用指針來改變了coutaendl;printf(a:%dn, a);printf(b:%dn, b);printf(&a:%dn, &a);printf(&b:%dn, &b);system(pause);retu

40、rn 0;案例2:void main41()int a = 10;const int &b = a; /const引用 使用變量a初始化a = 11;/b = 12; /通過引用修改a,對不起修改不了system(pause);struct Teacher1char name64;int age;void printTe2(const Teacher1 *const pt)/const引用讓變量(所指內(nèi)存空間)擁有只讀屬性void printTe(const Teacher1 &t)/t.age = 11;void main42()Teacher1 t1;t1.age = 33;printTe

41、(t1);system(pause);2使用字面量常量初始化const引用思考:1、用變量對const引用初始化,const引用分配內(nèi)存空間了嗎?2、用常量對const引用初始化,const引用分配內(nèi)存空間了嗎?void main()const int b = 10;printf(b:%d, &b);/int &a1 = 19; 如果不加const編譯失敗const int &a = 19;printf(&a:%d n, &a);system(pause);3 綜合案例void main()/普通引用int a = 10;int &b = a;/常量引用 :讓變量引用只讀屬性const int

42、 &c = a; /常量引用初始化 分為兩種/1 用變量 初始化 常量引用int x = 20;const int& y = x;printf(y:%d n, y);/2 用常量 初始化 常量引用/int &m = 10; /引用是內(nèi)存空間的別名 字面量10沒有內(nèi)存空間 沒有方法做引用const int &m = 10; couthello.endl;system(pause);return ;3 const引用結(jié)論 1)Const & int e 相當(dāng)于 const int * const e2)普通引用 相當(dāng)于 int *const e13)當(dāng)使用常量(字面量)對const引用進(jìn)行初始化時(shí)

43、,C+編譯器會為常量值分配空間,并將引用名作為這段空間的別名4)使用字面量對const引用初始化后,將生成一個(gè)只讀變量4const修飾類 后續(xù)課程介紹5綜合練習(xí)int& j()static int a = 0;return a;int& g()int a = 0;return a;int main()int a = g();int& b = g();j() = 10;printf(a = %dn, a);printf(b = %dn, b);printf(f() = %dn, f();system(pause);return 0;7C+對C的函數(shù)擴(kuò)展 1 inline內(nèi)聯(lián)函數(shù)C+中的const常量可以替代宏常數(shù)定義,如:const int A = 3; #define A 3C+中是否有解決方案替代宏代碼片段呢?(替代宏代碼片段就可以避免宏的副作用?。〤+中推薦使用內(nèi)聯(lián)函數(shù)替代宏代碼片段C+中使用inline關(guān)鍵字聲明內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)聲明時(shí)inline關(guān)鍵字必須和函數(shù)定義結(jié)合在一起,否則編譯器會直接忽略內(nèi)聯(lián)請求。/宏替換和函數(shù)調(diào)用區(qū)別#include iostreamusing name

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論