c++基礎(chǔ)和進(jìn)階課堂講義完整版_第1頁
c++基礎(chǔ)和進(jìn)階課堂講義完整版_第2頁
c++基礎(chǔ)和進(jìn)階課堂講義完整版_第3頁
c++基礎(chǔ)和進(jìn)階課堂講義完整版_第4頁
c++基礎(chǔ)和進(jìn)階課堂講義完整版_第5頁
已閱讀5頁,還剩300頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、傳智播客C+課程講義 傳智掃地僧1、C+對(duì)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#include<iostream.h>using name std;void main () double r, girth, area ; const double PI = 3.1415 ; cout << "Plea

2、se input radius:n" ; /操作符重載 cin >> r ; /輸入 girth = 2 * PI * r ; area = PI * r * r ; cout << "radius = " << r << endl ; cout << "girth = " << girth << endl ; cout << "area = " << area << endl ;方法2:用面向?qū)ο蠓椒ň幊?/p>

3、,求圓的周長和面積#include<iostream.h> using name std;class Circle double radius ; /成員變量 public : /類的訪問控制 void Set_Radius( double r ) radius = r ; /成員函數(shù) double Get_Radius() return radius ; /通過成員函數(shù)設(shè)置成員變量 double Get_Girth() return 2 * 3.14f * radius ; /通過成員函數(shù)獲取成員變量 double Get_Area() return 3.14f * radius

4、 * radius ; ;void main() Circle A, B ; /用類定義對(duì)象 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() << end

5、l ; B.Set_Radius( 10.5 ) ; cout << "B.radius = " << B.Get_Radius() << endl ; cout << "B.Girth=" << B.Get_Girth() << endl ; cout << "B.Area = " << B.Get_Area() << endl ; 總結(jié):建立類、對(duì)象、成員變量、成員函數(shù),輸入輸入流根本概念。1.2初學(xué)者易犯錯(cuò)誤模型/ dem

6、o02_circle_err.cpp#include<iostream>using namespace std;/c+的命名空間class circlepublic:double r;double pi = 3.1415926;double area = pi*r*r;int main()circle pi;cout << "請(qǐng)輸入area" << endl;cin >> pi.r;cout << pi.area << endl;/亂碼system("pause");return 0

7、;總結(jié):從內(nèi)存四區(qū)的角度,解釋為什么會(huì)出現(xiàn)亂碼理解為什么需要成員函數(shù)2程序設(shè)計(jì)方法的開展歷程面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法 l 設(shè)計(jì)思路 自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。l 程序結(jié)構(gòu): 按功能劃分為假設(shè)干個(gè)根本模塊,形成一個(gè)樹狀結(jié)構(gòu)。 各模塊間的關(guān)系盡可能簡單,功能上相對(duì)獨(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 缺點(diǎn):可重用性差、數(shù)據(jù)平安性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件 把數(shù)據(jù)和處理數(shù)據(jù)的過程別離為相互

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

9、來描述l 動(dòng)態(tài)特征:對(duì)象所表現(xiàn)的行為或具有的功能l 面向?qū)ο蠓椒ㄖ械膶?duì)象: 是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是用來構(gòu)成系統(tǒng)的一個(gè)根本單位。對(duì)象由一組屬性和一組行為構(gòu)成。 屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。 行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列。類 l 分類人類通常的思維方法l 分類所依據(jù)的原那么抽象 忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。 例如,石頭、樹木、汽車、房屋等都是人們?cè)陂L期的生產(chǎn)和生活實(shí)踐中抽象出的概念。l 面向?qū)ο蠓椒ㄖ械?quot;類" 具有相同屬性和效勞的一組對(duì)象的集合

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

11、個(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):分析解決問題所需要的步驟利用函數(shù)實(shí)現(xiàn)各個(gè)步驟依次調(diào)用函數(shù)解決問題問題:軟件可重用性差軟件可維護(hù)性差構(gòu)建的軟件無法

12、滿足用戶需求面向?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í)語言的特征 直接利用指針進(jìn)行內(nèi)存操作C語言的目標(biāo)是高效最終程序執(zhí)行效率的高效當(dāng)面向過程方法論暴露越來越多的缺陷的時(shí)候,業(yè)界開始考慮在工程工程中引入面向?qū)ο蟮脑O(shè)計(jì)方法,而第一個(gè)需要解決的問題就

13、是:高效的面向?qū)ο笳Z言,并且能夠兼容已經(jīng)存在的代碼。C語言 + 面向?qū)ο蠓椒ㄕ??Objective C /C+C語言和C+并不是對(duì)立的競爭關(guān)系C+是C語言的加強(qiáng),是一種更好的C語言C+是以C語言為根底的,并且完全兼容C語言的特性學(xué)習(xí)C+并不會(huì)影響原有的C語言知識(shí),相反會(huì)根據(jù)加深對(duì)C的認(rèn)知;學(xué)習(xí)C+可以接觸到更多的軟件設(shè)計(jì)方法,并帶來更多的時(shí)機(jī)。1) C+是一種更強(qiáng)大的C,通過學(xué)習(xí)C+能夠掌握更多的軟件設(shè)計(jì)方法2) C+是Java/C#/D等現(xiàn)代開發(fā)語言的根底,學(xué)習(xí)C+后能夠快速掌握這些語言3C+是各大知名軟件企業(yè)挑選人才的標(biāo)準(zhǔn)之一 4 C+對(duì)C的加強(qiáng)4.1 namespace命名空間1 C+

14、命名空間根本常識(shí)所謂namespace,是指標(biāo)識(shí)符的各種可見范圍。C+標(biāo)準(zhǔn)程序庫中的所有標(biāo)識(shí)符都被定義于一個(gè)名為std的namespace中。一 :<iostream>和<iostream.h>格式不一樣,前者沒有后綴,實(shí)際上,在你的編譯器include文件夾里面可以看到,二者是兩個(gè)文件,翻開文件就會(huì)發(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)使用<iostream.h>時(shí),

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

16、d:cin; 以上程序可以寫成 cout << std:hex << 3.4 << endl;3、最方便的就是使用using namespace std; 例如: using namespace std;這樣命名空間std內(nèi)定義的所有標(biāo)識(shí)符都有效曝光。就好似它們被聲明為全局變量一樣。那么以上語句可以如下寫: cout <<hex << 3.4 << endl;因?yàn)闃?biāo)準(zhǔn)庫非常的龐大,所以程序員在選擇的類的名稱或函數(shù)名 時(shí)就很有可能和標(biāo)準(zhǔn)庫中的某個(gè)名字相同。所以為了防止這種情況所造成的名字沖突,就把標(biāo)準(zhǔn)庫中的一切都被放在名字空

17、間std中。但這又會(huì)帶來了一個(gè)新問 題。無數(shù)原有的C+代碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫中的功能,他們都是在全局空間下的。所以就有了<iostream.h> 和<iostream>等等這樣的頭文件,一個(gè)是為了兼容以前的C+代碼,一個(gè)是為了支持新的標(biāo)準(zhǔn)。命名空間std封裝的是標(biāo)準(zhǔn)程序庫的名稱,標(biāo)準(zhǔn)程序庫為了和以前的頭文件區(qū)別,一般不加".h"2 C+命名空間定義及使用語法/*在C+中,名稱name可以是符號(hào)常量、變量、宏、函數(shù)、結(jié)構(gòu)、枚舉、類和對(duì)象等等。為了防止,在大規(guī)模程序的設(shè)計(jì)中,以及在程序員使用各種各樣的C+庫時(shí),這些標(biāo)識(shí)符的命名發(fā)生沖突,標(biāo)準(zhǔn)C+

18、引入了關(guān)鍵字namespace命名空間/名字空間/名稱空間/名域,可以更好地控制標(biāo)識(shí)符的作用域。*/*std是c+標(biāo)準(zhǔn)命名空間,c+標(biāo)準(zhǔn)程序庫中的所有標(biāo)識(shí)符都被定義在std中,比方標(biāo)準(zhǔn)庫中的類iostream、vector等都定義在該命名空間中,使用時(shí)要加上using聲明(using namespace std) 或using指示(如std:string、std:vector<int>).*/*C中的命名空間在C語言中只有一個(gè)全局作用域C語言中所有的全局標(biāo)識(shí)符共享同一個(gè)作用域標(biāo)識(shí)符之間可能發(fā)生沖突 C+中提出了命名空間的概念命名空間將全局作用域分成不同的局部不同命名空間中的標(biāo)識(shí)符可

19、以同名而不會(huì)發(fā)生沖突命名空間可以相互嵌套全局作用域也叫默認(rèn)命名空間*/*C+命名空間的定義:namespace name */*C+命名空間的使用:使用整個(gè)命名空間:using namespace name;使用命名空間中的變量:using name:variable;使用默認(rèn)命名空間中的變量::variable默認(rèn)情況下可以直接使用默 認(rèn)命名空間中的所有標(biāo)識(shí)符*/3 C+命名空間編程實(shí)踐namespace NameSpaceAint a = 0;namespace NameSpaceBint a = 1;namespace NameSpaceCstruct Teacherchar name1

20、0;int age;int main()using namespace NameSpaceA;using NameSpaceB:NameSpaceC:Teacher;printf("a = %dn", a);printf("a = %dn", NameSpaceB:a);NameSpaceB:NameSpaceC:Teacher t2Teacher t1 = "aaa", 3;printf(" = %sn", );printf("t1.age = %dn", t1.a

21、ge);system("pause");return 0;4 結(jié)論1) 當(dāng)使用<iostream>的時(shí)候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。假設(shè)不引入using namespace std ,需要這樣做。std:cout。2) c+標(biāo)準(zhǔn)為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定頭文件不使用后綴.h。3) C+命名空間的定義:namespace name 4) using namespace NameSpaceA;5) namespce定義可嵌套。4.2 “實(shí)用性增加#include "iost

22、ream"using 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)鍵字 請(qǐng)求編譯器讓變量a直接放在存放器里面,速度快/在c語言中 register修飾的變量 不能取地址,但是在c+里面做了內(nèi)容/*/1register關(guān)鍵字的變化register關(guān)鍵字請(qǐng)求“編譯器將

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

24、;其他補(bǔ)充:請(qǐng)閱讀?register關(guān)鍵字常識(shí)課外閱讀.docx?4.4變量檢測增強(qiáng)/*在C語言中,重復(fù)定義多個(gè)同名的全局變量是合法的在C+中,不允許定義多個(gè)同名的全局變量C語言中多個(gè)同名的全局變量最終會(huì)被鏈接到全局?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)為這是一種新

25、的類型C+中的struct是一個(gè)新類型的定義聲明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&q

26、uot;, i);g()return 5;int main(int argc, char *argv)f(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)類型,任意的程序元素都必須顯示指明類型屬于語法級(jí)別的增強(qiáng)。4.7新增Bool類型關(guān)鍵字 /*C+中的布爾類型C+在

27、C語言的根本類型系統(tǒng)之上增加了boolC+中的bool可取的值只有true和false理論上bool只占用一個(gè)字節(jié),如果多個(gè)bool變量定義在一起,可能會(huì)各占一個(gè)bit,這取決于編譯器的實(shí)現(xiàn)true代表真值,編譯器內(nèi)部用1來表示false代表非真值,編譯器內(nèi)部用0來表示bool類型只有true非0和false0兩個(gè)值C+編譯器會(huì)在賦值時(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);

28、b = 4;a = b;printf("a = %d, b = %dn", a, b);b = -4;a = b;printf("a = %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;/返

29、回一個(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é)論 1C語言返回變量的值 C+語言是返回變量本身C語言中的三目運(yùn)算符返回的是變量值,不能作為左值使用C+中的三目運(yùn)算符可直接返回變量本身,因此可以出現(xiàn)在程序的任何地方2注意:三目運(yùn)算符可能返回的值中如果有一個(gè)是常量值,那么不能作為左值使用(a < b ? 1 : b )= 30;3C語言如何支持類似C+的

30、特性呢?=>當(dāng)左值的條件:要有內(nèi)存空間;C+編譯器幫助程序員取了一個(gè)地址而已思考:如何讓C中的三目運(yùn)算法當(dāng)左值呢?5 C/C+中的const 1 const根底知識(shí)用法、含義、好處int main()const int a;int const b;const int *c;int * const d;const int * const e ;return 0;Int func1(const )初級(jí)理解:const是定義常量=?const意味著只讀含義:/第一個(gè)第二個(gè)意思一樣 代表一個(gè)常整形數(shù)/第三個(gè) c是一個(gè)指向常整形數(shù)的指針(所指向的內(nèi)存數(shù)據(jù)不能被修改,但是本身可以修改)/第四個(gè) d

31、常指針指針變量不能被修改,但是它所指向內(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)虻膬?nèi)存空間2 C中“冒牌貨int main()const int a = 10;int *p = (int*)&a; printf("a=>%dn", a);*p = 11;prin

32、tf("a=>%dn", a);printf("Hello.n");return 0;解釋:C+編譯器對(duì)const常量的處理當(dāng)碰見常量聲明時(shí),在符號(hào)表中放入常量 =è問題:那有如何解釋取地址編譯過程中假設(shè)發(fā)現(xiàn)使用常量那么直接以符號(hào)表中的值替換編譯過程中假設(shè)發(fā)現(xiàn)對(duì)const使用了extern或者&操作符,那么給對(duì)應(yīng)的常量分配存儲(chǔ)空間兼容C?聯(lián)想: int &a = 1(err) & const int &a = 10(ok)? C+中const符號(hào)表原理圖注意:C+編譯器雖然可能為const常量分配空間,但不

33、會(huì)使用其存儲(chǔ)空間中的值。結(jié)論:C語言中的const變量C語言中const變量是只讀變量,有自己的存儲(chǔ)空間C+中的const常量可能分配存儲(chǔ)空間,也可能不分配存儲(chǔ)空間 當(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+) printf("array%d = %dn&q

34、uot;, 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í)void fun1() #define a 1

35、0 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變量是只讀變量,有自己的存儲(chǔ)空間C+中的const常量可能分配存儲(chǔ)空間,也可能不分配存儲(chǔ)空間 當(dāng)const常量為全局,并且需要在其它文件中使用,會(huì)分配存儲(chǔ)空間當(dāng)使用&操作符,取const常量的地址時(shí),會(huì)分配存儲(chǔ)空間當(dāng)const int &

36、;a = 10; const修飾引用時(shí),也會(huì)分配存儲(chǔ)空間6引用專題講座1引用普通引用變量名回憶變量名實(shí)質(zhì)上是一段連續(xù)存儲(chǔ)空間的別名,是一個(gè)標(biāo)號(hào)(門牌號(hào)) 程序中通過變量來申請(qǐng)并命名內(nèi)存空間 通過變量的名字可以使用存儲(chǔ)空間問題1:對(duì)一段連續(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就是

37、a的別名。a =11; /直接賦值int *p = &a;*p = 12;printf("a %d n",a);b = 14; printf("a:%d b:%d", a, b);system("pause");2 引用是C+的概念 屬于C+編譯器對(duì)C的擴(kuò)展問題:C中可以編譯通過嗎?int main()int a = 0;int &b = a; /int * const b = &a b = 11; /*b = 11;return 0;結(jié)論:請(qǐng)不要用C的語法考慮 b=113 引用做函數(shù)參數(shù) 普通引用在聲明時(shí)必須

38、用其它的變量進(jìn)行初始化,引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化/05復(fù)雜數(shù)據(jù)類型 的引用struct Teacherchar name64;int age ;void printfT(Teacher *pT)cout<<pT->age<<endl;/pT是t1的別名 ,相當(dāng)于修改了t1void printfT2(Teacher &pT)/cout<<pT.age<<endl;pT.age = 33;/pT和t1的是兩個(gè)不同的變量void printfT3(Teacher pT)cout<<pT.age<<endl

39、;pT.age = 45; /只會(huì)修改pT變量 ,不會(huì)修改t1變量void main()Teacher t1;t1.age = 35;printfT(&t1);printfT2(t1); /pT是t1的別名printf("t1.age:%d n", t1.age); /33printfT3(t1) ;/ pT是形參 ,t1 copy一份數(shù)據(jù) 給pT /-> pT = t1printf("t1.age:%d n", t1.age); /35cout<<"hello."<<endl; system(&

40、quot;pause");return ;4 引用的意義 1引用作為其它變量的別名而存在,因此在一些場合可以代替指針2引用相對(duì)于指針來說具有更好的可讀性和實(shí)用性5 引用本質(zhì)思考思考1:C+編譯器背后做了什么工作?int main() int a = 10;int &b = a;/b是a的別名,請(qǐng)問c+編譯器后面做了什么工作?b = 11;cout<<"b->"<<a<<endl;printf("a:%dn", a);printf("b:%dn", b);printf(&quo

41、t;&a:%dn", &a);printf("&b:%dn", &b); /請(qǐng)思考:對(duì)同一內(nèi)存空間可以取好幾個(gè)名字嗎?system("pause");return 0;單獨(dú)定義的引用時(shí),必須初始化;說明很像一個(gè)常量思考2:普通引用有自己的空間嗎?struct Teacer int &a;int &b;int main()printf("sizeof(Teacher) %dn", sizeof(Teacer);system("pause");return 0;

42、引用是一個(gè)有地址,引用是常量。char *const p6 引用的本質(zhì)1引用在C+中的內(nèi)部實(shí)現(xiàn)是一個(gè)常指針Type& name çèType* const name2C+編譯器在編譯過程中使用常指針作為引用的內(nèi)部實(shí)現(xiàn),因此引用所占用的空間大小與指針相同。3從使用的角度,引用會(huì)讓人誤會(huì)其只是一個(gè)別名,沒有自己的存儲(chǔ)空間。這是C+為了實(shí)用性而做出的細(xì)節(jié)隱藏Int main()int x = 10;func(x);4) 請(qǐng)仔細(xì)比照間接賦值成立的三個(gè)條件1定義兩個(gè)變量 一個(gè)實(shí)參一個(gè)形參2建立關(guān)聯(lián) 實(shí)參取地址傳給形參3*p形參去間接的修改實(shí)參的值7引用結(jié)論 1引用在實(shí)現(xiàn)上,只

43、不過是把:間接賦值成立的三個(gè)條件的后兩步和二為一/當(dāng)實(shí)參傳給形參引用的時(shí)候,只不過是c+編譯器幫我們程序員手工取了一個(gè)實(shí)參地址,傳給了形參引用常量指針2當(dāng)我們使用引用語法的時(shí),我們不去關(guān)心編譯器引用是怎么做的當(dāng)我們分析奇怪的語法現(xiàn)象的時(shí),我們才去考慮c+編譯器是怎么做的8函數(shù)返回值是引用(引用當(dāng)左值)C+引用使用時(shí)的難點(diǎn):當(dāng)函數(shù)返回值為引用時(shí)假設(shè)返回棧變量不能成為其它引用的初始值不能作為左值使用假設(shè)返回靜態(tài)變量或全局變量可以成為其他引用的初始值即可作為右值使用,也可作為左值使用C+鏈?zhǔn)骄幊讨?,?jīng)常用到引用,運(yùn)算符重載專題返回值是根底類型,當(dāng)引用int getAA1()int a;a = 10;

44、return a;/根底類型a返回的時(shí)候,也會(huì)有一個(gè)副本int& getAA2()int a;a = 10;return a;int* getAA3()int a;a = 10;return &a;返回值是static變量,當(dāng)引用/static修飾變量的時(shí)候,變量是一個(gè)狀態(tài)變量int j()static int a = 10;a +;printf("a:%d n", a);return a;int& j1()static int a = 10;a +;printf("a:%d n", a);return a;int *j2()st

45、atic int a = 10;a +;printf("a:%d n", a);return &a; void main22()/ j()的運(yùn)算結(jié)果是一個(gè)數(shù)值,沒有內(nèi)存地址,不能當(dāng)左值。/11 = 100;/*(a>b?&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;

46、return *p;int& g2(int *p) /*p = 100;return *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(&quo

47、t;pause");返回值非根底類型 struct Teacharchar name64;int age;/如果返回引用不是根底類型,是一個(gè)類,那么情況非常賦值。涉及到copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teacharchar name64;int age;/如果返回引用不是根底類型,是一個(gè)類,那么情況非常賦值。涉及到copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teachar & OpTeacher(struct Teachar &t1)9指針引用 #include "iostream"using namespace std;s

48、truct Teacherchar name64;int age;int getTe(Teacher *myp )Teacher *p = (Teacher *)malloc(sizeof(Teacher);if (p =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 ma

49、in333()Teacher *p = NULL;/getTe(&p);getTe2(p);printf("age:%d n", p->age);system("pause");2常引用下面開始進(jìn)入const引用難點(diǎn)1 使用變量初始化const引用 思考cost int &a = b PK const int &a = 10;?問題:const引用,在C+中可以聲明const引用const Type& name = var;const引用讓變量擁有只讀屬性 案例1:int main()int a = 10;const

50、 int &b = a; /int *p = (int *)&b;b = 11; /err/*p = 11; /只能用指針來改變了cout<<"b->"<<a<<endl;printf("a:%dn", a);printf("b:%dn", b);printf("&a:%dn", &a);printf("&b:%dn", &b);system("pause");return 0;案例2:

51、void main41()int a = 10;const int &b = a; /const引用 使用變量a初始化a = 11;/b = 12; /通過引用修改a,對(duì)不起修改不了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 =

52、 33;printTe(t1);system("pause");2使用字面量常量初始化const引用思考:1、用變量對(duì)const引用初始化,const引用分配內(nèi)存空間了嗎?2、用常量對(duì)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("pau

53、se");3 綜合案例void main()/普通引用int a = 10;int &b = a;/常量引用 :讓變量引用只讀屬性const int &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; cout<<"hello.&qu

54、ot;<<endl;system("pause");return ;3 const引用結(jié)論 1Const & int e 相當(dāng)于 const int * const e2普通引用 相當(dāng)于 int *const e13當(dāng)使用常量字面量對(duì)const引用進(jìn)行初始化時(shí),C+編譯器會(huì)為常量值分配空間,并將引用名作為這段空間的別名4使用字面量對(duì)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"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論