版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、輕松入門實(shí)戰(zhàn)應(yīng)用傳智播客C+課程傳智播客C+課程講義傳智掃地僧1、C+寸C的擴(kuò)展1簡(jiǎn)單的C+程序1.1求圓的周長(zhǎng)和面積數(shù)據(jù)描述:半徑,周長(zhǎng),面積均用實(shí)型數(shù)表示 數(shù)據(jù)處理:輸入半徑r;計(jì)算周長(zhǎng)=2* n*計(jì)算面積=n r2 ;輸出半徑,周長(zhǎng),面積;方法1:用結(jié)構(gòu)化方法編程,求圓的周長(zhǎng)和面積/ count the girth and area of circle#in clude<iostream.h> using n ame std;void mai n () double r, girth, area ;const double PI = 3.1415 ;cout <<
2、 "Please in put 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:用
3、面向?qū)ο蠓椒ň幊?,求圓的周長(zhǎng)和面積分析“圓"是抽象的類類型 半笹? I 建立具體的圓(對(duì)象)I圓的周長(zhǎng)? 面積?分析圓類戰(zhàn)員變量半輕成員陰數(shù)置半徑值 求圓的半徑 求周長(zhǎng)求面積#in clude<iostream.h> using n ame std; class Circle double radius ; / 成員變量public : /類的訪問控制void Set_Radius( double r ) radius = r ; / 成員函數(shù)double Get_Radius() double Get_Girth() double Get_Area() return r
4、adius ; /通過成員函數(shù)設(shè)置成員變量 return 2 * 3.14f * radius ; /通過成員函數(shù)獲取成員變量 return 3.14f * radius * radius ; void mai n()Circle A, B ; /用類定義對(duì)象A.Set_Radius( 6.23 ) ; / 類的調(diào)用cout << "A.Radius = " << A.Get Radius() << endl ;輕松入門實(shí)戰(zhàn)應(yīng)用傳智播客C+課程cout << "A.Girth = " << A.
5、Get_Girth() << endl; cout << "A.Area = " << A.Get_Area() << endl ; B.Set_Radius( 10.5 );cout << "B.radius = " << B.Get_Radius() << endl ; cout << "B.Girth=" << B.Get_Girth() << endl ;cout << "B.Area
6、= " << B.Get_Area() << endl ;總結(jié):建立類、對(duì)象、成員變量、成員函數(shù),輸入輸入流基本概念。1.2初學(xué)者易犯錯(cuò)誤模型/ demo02_circle_err.cpp#in clude<iostream>using n amespace std;/c+ 的命名空間 class circlepublic:double r;double pi = 3.1415926;double area = pi*r*r;int mai n()circle pi;cout << "請(qǐng)輸入 area" <&l
7、t; endl; cin >> pi.r;cout << pi.area << endl; / 舌L碼system("pause");return 0;總結(jié):從內(nèi)存四區(qū)的角度,解釋為什么會(huì)出現(xiàn)亂碼 理解為什么需要成員函數(shù)2程序設(shè)計(jì)方法的發(fā)展歷程面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法設(shè)計(jì)思路-自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。 程序結(jié)構(gòu):-按功能劃分為若干個(gè)基本模塊,形成一個(gè)樹狀結(jié)構(gòu)。-各模塊間的關(guān)系盡可能簡(jiǎn)單,功能上相對(duì)獨(dú)立;每一模塊內(nèi)部均是由順序、 選擇和循環(huán)三種基本結(jié)構(gòu)組成。-其模塊化實(shí)現(xiàn)的具體方法是使用子程序。優(yōu)
8、點(diǎn):有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子任務(wù),便于開發(fā)和維護(hù)。缺點(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)的修改。-每一種相對(duì)于老問題的新方法都要帶來(lái)額外的開銷。-圖形用戶界面的應(yīng)用程序, 很難用過程來(lái)描述和實(shí)現(xiàn), 開發(fā)和維護(hù)也都很困 難。面向?qū)ο蟮姆椒▽?shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體一-對(duì)象。對(duì)同類型對(duì)象抽象出其共性,形成類。 類通過一個(gè)簡(jiǎn)單的外部接口,與外界發(fā)生關(guān)系。對(duì)象與對(duì)象之間通過消息進(jìn)行通信。面向?qū)ο蟮?/p>
9、基本概念對(duì)象一般意義上的對(duì)象:-是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物。-可以是有形的(比如一輛汽車),也可以是無(wú)形的(比如一項(xiàng)計(jì)劃) 。-是構(gòu)成世界的一個(gè)獨(dú)立單位,具有 靜態(tài)特征:可以用某種數(shù)據(jù)來(lái)描述 動(dòng)態(tài)特征:對(duì)象所表現(xiàn)的行為或具有的功能 面向?qū)ο蠓椒ㄖ械膶?duì)象:-是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是用來(lái)構(gòu)成系統(tǒng)的一個(gè)基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。-屬性:用來(lái)描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。-行為:用來(lái)描述對(duì)象動(dòng)態(tài)特征的操作序列。類分類一一人類通常的思維方法 分類所依據(jù)的原則一一抽象-忽略事物的非本質(zhì)特征, 只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出 事物的共性,把具有共同性質(zhì)的事物劃分為
10、一類,得出一個(gè)抽象的概念。-例如,石頭、樹木、汽車、房屋等都是人們?cè)陂L(zhǎng)期的生產(chǎn)和生活實(shí)踐中抽象 出的概念。面向?qū)ο蠓椒ㄖ械?quot;類”-具有相同屬性和服務(wù)的一組對(duì)象的集合-為屬于該類的全部對(duì)象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。-類與對(duì)象的關(guān)系:猶如模具與鑄件之間的關(guān)系,一個(gè)屬于某類的對(duì)象稱為該類的一個(gè)實(shí)例。封裝也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單元。盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)外形成一個(gè)邊界(或者說一道屏障),只保留有限的 對(duì)外接口使之與外部發(fā)生聯(lián)系。繼承對(duì)于軟件復(fù)
11、用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟件開發(fā)效率的重要原 因之一。定義:特殊類的對(duì)象擁有其一般類的全部屬性與服務(wù),稱作特殊類對(duì)一般類的繼承。例如:將輪船作為一個(gè)一般類,客輪便是一個(gè)特殊類。多態(tài)多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在一般類及其各個(gè)特殊類中具有不同的語(yǔ)義。面向?qū)ο蟮能浖こ堂嫦驅(qū)ο蟮能浖こ淌敲嫦驅(qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用。它包括:-面向?qū)ο蟮姆治觯?0A)-面向?qū)ο蟮脑O(shè)計(jì)(00D)-面向?qū)ο蟮木幊蹋∣OP)-面向?qū)ο蟮臏y(cè)試(00T)-面向?qū)ο蟮能浖S護(hù)(OOSM)總結(jié):面向過程程序設(shè)計(jì):數(shù)據(jù)
12、結(jié)構(gòu)+算法主要解決科學(xué)計(jì)算問題,用戶需求簡(jiǎn)單而固定特點(diǎn):分析解決問題所需要的步驟利用函數(shù)實(shí)現(xiàn)各個(gè)步驟依次調(diào)用函數(shù)解決問題問題:軟件可重用性差軟件可維護(hù)性差構(gòu)建的軟件無(wú)法滿足用戶需求面向?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)勢(shì):構(gòu)建的軟件能夠適應(yīng)用戶需求的不斷變化 直接利用面向過程方法的優(yōu)勢(shì)而避開其劣勢(shì)3 C 語(yǔ)言和 C+語(yǔ)言關(guān)系c語(yǔ)言是在實(shí)踐的過程中逐步完善起來(lái)的沒有深思熟慮的設(shè)計(jì)過程使用時(shí)存在很多“灰色地帶 ”殘留量過多低級(jí)語(yǔ)言的特征直
13、接利用指針進(jìn)行內(nèi)存操作C語(yǔ)言的目標(biāo)是高效最終程序執(zhí)行效率的咼效當(dāng)面向過程方法論暴露越來(lái)越多的缺陷的時(shí)候,業(yè)界開始考慮在工程項(xiàng)目中引入面向?qū)ο蟮脑O(shè)計(jì)方法,而第一個(gè)需要解決的問題就是:高效的面向?qū)ο笳Z(yǔ)言,并且能夠兼容已經(jīng)存在的代碼。C語(yǔ)言 +面向?qū)ο蠓椒ㄕ?Objective C /C+C語(yǔ)言和C+并不是對(duì)立的競(jìng)爭(zhēng)關(guān)系C+是 C語(yǔ)言的加強(qiáng),是一種更好的C語(yǔ)言C+是以C語(yǔ)言為基礎(chǔ)的,并且完全兼容C語(yǔ)言的特性學(xué)習(xí)C+并不會(huì)影響原有的 C語(yǔ)言知識(shí),相反會(huì)根據(jù)加深對(duì)C的認(rèn)知;學(xué)習(xí)C+可以接觸到更多的軟件設(shè)計(jì)方法,并帶來(lái)更多的機(jī)會(huì)。1) C+是 一種更強(qiáng)大的 C,通過學(xué)習(xí)C+能夠掌握更多的軟件設(shè)計(jì)方法2)
14、C+是 Java/C#/D等現(xiàn)代開發(fā)語(yǔ)言的基礎(chǔ),學(xué)習(xí)C+后能夠快速掌握這些語(yǔ)言3) C+是各大知名軟件企業(yè)挑選人才的標(biāo)準(zhǔn)之一4 C+對(duì)C的加強(qiáng)4.1 namespace命名空間1 C+命名空間基本常識(shí)所謂namespace,是指標(biāo)識(shí)符的各種可見范圍。C+標(biāo)準(zhǔn)程序庫(kù)中的所有標(biāo)識(shí)符都被定 義于一個(gè)名為 std的namespace中。一:<iostream>和<iostream.h>格式不一樣,前者沒有后綴,實(shí)際上,在你的編譯器in elude 文件夾里面可以看到,二者是兩個(gè)文件,打開文件就會(huì)發(fā)現(xiàn),里面的代碼是不一樣的。后綴為.h的頭文件C+標(biāo)準(zhǔn)已經(jīng)明確提出不支持了,早些的實(shí)
15、現(xiàn)將標(biāo)準(zhǔn)庫(kù)功能定義在全局空間里,聲明在帶.h后綴的頭文件里,C+標(biāo)準(zhǔn)為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定頭 文件不使用后綴.h。因此,1)當(dāng)使用<iostream.h>時(shí),相當(dāng)于在c中調(diào)用庫(kù)函數(shù),使用的是全局命名空間,也就是 早期的C+實(shí)現(xiàn);2) 當(dāng)使用<iostream>的時(shí)候,該頭文件沒有定義全局命名空間,必須使用namespace std ; 這樣才能正確使用 cout。二:由于namespace的概念,使用 C+標(biāo)準(zhǔn)程序庫(kù)的任何標(biāo)識(shí)符時(shí),可以有三種選擇:1、 直接指定標(biāo)識(shí)符。例如std:ostream 而不是 ostream。完整語(yǔ)句如下:std:cou
16、t <<std:hex << 3.4 << std:endl;2、 使用 using 關(guān)鍵字。using std:cout; using std:endl; using std:cin; 以上程序可以寫成 cout << std:hex << 3.4 << en dl;3、 最方便的就是使用using namespace std; 例如:using namespace std;這樣命名空間std內(nèi)定義的所有標(biāo)識(shí)符都有效(曝光)。就好像它們被聲明為全局變量一樣。那么以上語(yǔ)句可以如下寫:cout <<hex <
17、;< 3.4 << endl;因?yàn)闃?biāo)準(zhǔn)庫(kù)非常的龐大,所以程序員在選擇的類的名 稱或函數(shù)名時(shí)就很有可能和標(biāo)準(zhǔn)庫(kù)中的某個(gè)名字相同。所以為了避免這種情況所造成的名字沖突,就把標(biāo)準(zhǔn)庫(kù)中的一切都被放在名字空間std中。但這又會(huì)帶來(lái)了一個(gè)新問題。無(wú)數(shù)原有的C+弋碼都依賴于使用了多年的偽標(biāo)準(zhǔn)庫(kù)中的功能,他們都是在全局空間下的。所以就有了 <iostream.h>和<iostream>等等這樣的頭文件,一個(gè)是為了兼容以前的C+代碼,一個(gè)是為了支持新的標(biāo)準(zhǔn)。命名空間std封裝的是標(biāo)準(zhǔn)程序庫(kù)的名稱,標(biāo)準(zhǔn)程序庫(kù)為了和以前的頭文件區(qū)別,一般不加".h"2
18、C+命名空間定義及使用語(yǔ)法/*在C+沖,名稱(name)可以是符號(hào)常量、變量、宏、函數(shù)、結(jié)構(gòu)、枚舉、類和對(duì)象等等。 為了避免,在大規(guī)模程序的設(shè)計(jì)中,以及在程序員使用各種各樣的C+庫(kù)時(shí),這些標(biāo)識(shí)符的命名發(fā)生沖突,標(biāo)準(zhǔn)C+引入了關(guān)鍵字 namespace (命名空間/名字空間/名稱空間/名域),可以更好地 控制標(biāo)識(shí)符的作用域。*/*std是C+標(biāo)準(zhǔn)命名空間,C+標(biāo)準(zhǔn)程序庫(kù)中的所有標(biāo)識(shí)符都被定義在std中,比如標(biāo)準(zhǔn)庫(kù)中的類 iostream、vector等都定義在該命名空間中,使用時(shí)要加上using聲明(using namespace std) 或using指示(如std:string、std:ve
19、ctor<i nt>).*/*C中的命名空間在C語(yǔ)言中只有一個(gè)全局作用域C語(yǔ)言中所有的全局標(biāo)識(shí)符共享同一個(gè)作用域標(biāo)識(shí)符之間可能發(fā)生沖突C+中提出了命名空間的概念命名空間將全局作用域分成不同的部分不同命名空間中的標(biāo)識(shí)符可以同名而不會(huì)發(fā)生沖突命名空間可以相互嵌套全局作用域也叫默認(rèn)命名空間*/*C+命名空間的定義:n amespace n ame , -*/*C+命名空間的使用:使用整個(gè)命名空間:using n amespace n ame;使用命名空間中的變量:using n ame:variable;使用默認(rèn)命名空間中的變量::variable默認(rèn)情況下可以直接使用默認(rèn)命名空間中的所
20、有標(biāo)識(shí)符*/3 C+命名空間編程實(shí)踐n amespace NameSpaceAint a = 0;n amespace NameSpaceBint a = 1;n amespaceNameSpaceCstruct Teacherchar n ame10;int age;int main()usingn amespace NameSpaceA; using NameSpaceB:NameSpaceC:Teacher;printf( "a = %dn" , a);printf( "a = %dn" , NameSpaceB:a);NameSpaceB:Nam
21、eSpaceC:Teacher t2 Teacher t1 = "aaa" , 3;printf( "t1. name = %sn", t1. name);printf( "t1.age = %dn", t1.age);system( "pause");return 0;4結(jié)論1) 當(dāng)使用iostream的時(shí)候,該頭文件沒有定義全局命名空間,必須使用namespace std ;這樣才能正確使用 cout。若不引入 using namespace std ,需要這樣做。std:cout 。2) c+標(biāo)準(zhǔn)為了和C區(qū)別
22、開,也為了正確使用命名空間,規(guī)定頭文件不使用后綴.h。3) C+命名空間的定義:n amespace n ame , -4) using n amespace NameSpaceA;5) namespce定義可嵌套。4.2“實(shí)用性”增加#i nclude "iostream" using n amespace std;/C語(yǔ)言中的變量都必須在作用域開始的位置定義!/C+中更強(qiáng)調(diào)語(yǔ)言的“實(shí)用性”,所有的變量都可以在需要使用時(shí)再定義。int mai n11()int i = 0;prin tf("ddd"); int k;system("pause
23、"); return 0;4.3 register關(guān)鍵字增強(qiáng)/register關(guān)鍵字請(qǐng)求編譯器讓變量a直接放在寄存器里面,速度快/在c語(yǔ)言中register修飾的變量不能取地址,但是在C+里面做了內(nèi)容/*1register關(guān)鍵字的變化register關(guān)鍵字請(qǐng)求“編譯器”將局部變量存儲(chǔ)于寄存器中C語(yǔ)言中無(wú)法取得register變量地址在C+中依然支持register關(guān)鍵字C+編譯器有自己的優(yōu)化方式,不使用 register也可能做優(yōu)化C+中可以取得register變量的地址112C+編譯器發(fā)現(xiàn)程序中需要取register變量的地址時(shí),register對(duì)變量的聲明變得無(wú)效。3早期C語(yǔ)言編
24、譯器不會(huì)對(duì)代碼進(jìn)行優(yōu)化,因此register變量是一個(gè)很好的補(bǔ)充。*/int mai n22()register int a = 0;prin tf("&a = %xn", & a);system("pause");return 0;其他補(bǔ)充:請(qǐng)閱讀register關(guān)鍵字常識(shí)課外閱讀.docx4.4變量檢測(cè)增強(qiáng)/*在c語(yǔ)言中,重復(fù)定義多個(gè)同名的全局變量是合法的在C+中,不允許定義多個(gè)同名的全局變量C語(yǔ)言中多個(gè)同名的全局變量最終會(huì)被鏈接到全局?jǐn)?shù)據(jù)區(qū)的同一個(gè)地址空間上int g_var;int g_var = 1;C+直接拒絕這種二義性的做法
25、。*/int main (i nt argc, char *argv)prin tf("g_var = %dn", g_var);return 0;4.5 struct類型加強(qiáng)struct類型的加強(qiáng):C語(yǔ)言的struct定義了一組變量的集合,C編譯器并不認(rèn)為這是一種新的類型 C+中的struct是一個(gè)新類型的定義聲明 struct Stude ntchar name100;int age;;int main (i nt argc, char *argv)Stude nt si = "wa ng", 1;Student s2 = "wang2&q
26、uot;, 2; return 0;4.6 C+中所有的變量和函數(shù)都必須有類型/*C+中所有的變量和函數(shù)都必須有類型C語(yǔ)言中的默認(rèn)類型在C+中是不合法的函數(shù)f的返回值是什么類型,參數(shù)又是什么類型? 函數(shù)g可以接受多少個(gè)參數(shù)?*/II更換成.cpp試試f(i)prin tf("i = %dn", i);g()return 5;int main (i nt argc, char *argv)f(10);prin tf("g() = %dn", g(1,2, 3, 4, 5);getchar(); return 0;總結(jié):/*在C語(yǔ)言中int f( );表示返
27、回值為int,接受任意參數(shù)的函數(shù)int f(void);表示返回值為int的無(wú)參函數(shù)在 C+中int f();和int f(void)具有相同的意義,都表示返回值為int的無(wú)參函數(shù)*/C+更加強(qiáng)調(diào)類型,任意的程序元素都必須顯示指明類型4.2-4.6屬于語(yǔ)法級(jí)別的增強(qiáng)。4.7新增Bool類型關(guān)鍵字/*c+沖的布爾類型C+在 C語(yǔ)言的基本類型系統(tǒng)之上增加了boolC+中的bool可取的值只有true和false理論上bool只占用一個(gè)字節(jié),如果多個(gè)bool變量定義在一起,可能會(huì)各占一個(gè)bit,這取決于編譯器的實(shí)現(xiàn)true代表真值,編譯器內(nèi)部用 1來(lái)表示false代表非真值,編譯器內(nèi)部用 0來(lái)表示b
28、ool類型只有true (非0 )和false ( 0)兩個(gè)值C+編譯器會(huì)在賦值時(shí)將非0值轉(zhuǎn)換為true,0值轉(zhuǎn)換為false*/int main (i nt argc, char *argv)int a;bool b = true;printf("b = %d, sizeof(b) = %dn", b, sizeof(b);b = 4;a = b;prin tf("a = %d, b = %dn", a, b);b = -4;a = b;prin tf("a = %d, b = %dn", a, b); a = 10;b = a;p
29、rin tf("a = %d, b = %dn", a, b); b = 0;prin tf("b = %dn", b); system("pause");return 0;4.8三目運(yùn)算符功能增強(qiáng)1三目運(yùn)算符在C和C+編譯器的表現(xiàn)int mai n()int a = 10;int b = 20;/返回一個(gè)最小數(shù)并且給最小數(shù)賦值成3/三目運(yùn)算符是一個(gè)表達(dá)式,表達(dá)式不可能做左值(a < b ? a : b )= 30;prin tf("a = %d, b = %dn", a, b);system("p
30、ause");return 0;2結(jié)論1) C語(yǔ)言返回變量的值 C+語(yǔ)言是返回變量本身C語(yǔ)言中的三目運(yùn)算符返回的是變量值,不能作為左值使用C+中的三目運(yùn)算符可直接返回變量本身,因此可以出現(xiàn)在程序的任何地方2) 注意:三目運(yùn)算符可能返回的值中如果有一個(gè)是常量值,則不能作為左值使用(a < b ? 1 : b )= 30;3) C語(yǔ)言如何支持類似 C+的特性呢?=>當(dāng)左值的條件:要有內(nèi)存空間;C+編譯器幫助程序員取了一個(gè)地址而已思考:如何讓 C中的三目運(yùn)算法當(dāng)左值呢?5 C/C+ 中的 const1 const基礎(chǔ)知識(shí)(用法、含義、好處)int mai n()const in
31、t a;int const b;const int *c;int * const d;const int * const e ;return 0;Int fun c1(c onst )初級(jí)理解:const是定義常量=con st意味著只讀含義:/第一個(gè)第二個(gè)意思一樣代表一個(gè)常整形數(shù)/第三個(gè)c是一個(gè)指向常整形數(shù)的指針(所指向的內(nèi)存數(shù)據(jù)不能被修改,但是本身可以修改)/第四個(gè)d常指針(指針變量不能被修改,但是它所指向內(nèi)存空間可以被修改)/第五個(gè)e 一個(gè)指向常整形的常指針(指針和它所指向的內(nèi)存空間,均不能被修改)Con st好處/合理的利用const,/1指針做函數(shù)參數(shù),可以有效的提高代碼可讀性,減少
32、bug;/2清楚的分清參數(shù)的輸入和輸出特性int setTeacher_err( const Teacher *p)Con st修改形參的時(shí)候,在利用形參不能修改指針?biāo)虻膬?nèi)存空間2 C中“冒牌貨”int mai n()const int a = 10; int *p = (in t* )&a; printf("a=>%dn", a);*p = 11;prin tf("a=>%dn", a);printf("Hellon ”); return 0;解釋:C+編譯器對(duì)const常量的處理當(dāng)碰見常量聲明時(shí),在符號(hào)表中放入常量=問
33、題:那有如何解釋取地址編譯過程中若發(fā)現(xiàn)使用常量則直接以符號(hào)表中的值替換編譯過程中若發(fā)現(xiàn)對(duì) const使用了 extern或者&操作符,則給對(duì)應(yīng)的常量分配存儲(chǔ)空間(兼容C)?聯(lián)想:int &a = 1(err) &const int&a = 10(ok)?C+中con st符號(hào)表原理圖注意:C+編譯器雖然可能為 結(jié)論:con st常量分配空間,但不會(huì)使用其存儲(chǔ)空間中的值。C語(yǔ)言中的const變量C語(yǔ)言中con st變量是只讀變量,有自己的存儲(chǔ)空間C+中的con st常量可能分配存儲(chǔ)空間,也可能不分配存儲(chǔ)空間當(dāng)const常量為全局,并且需要在其它文件中使用 當(dāng)使用&
34、amp;操作符取con st常量的地址3 const和#define相同之處/練習(xí)解釋為什么#defi ne N 10int mai n()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”,i, arrayi);getchar();return 0;C+沖的const修飾的,是一個(gè)真正的常量,而不是C中變量(只讀)。在const修飾的常量編譯期間,就已經(jīng)確定下來(lái)了。4 const和 #define 的區(qū)別對(duì)比加深C+中
35、的const常量類似于宏定義const int c = 5; #define c 5C+中的const常量與宏定義不同con st常量是由編譯器處理的,提供類型檢查和作用域檢查 宏定義由預(yù)處理器處理,單純的文本替換II在func1定義a,在func2中能使用嗎?II在funci中定義的b,在func2中能使用嗎?練習(xí)void fun 1()#define a 10const int b = 20;#undef a# undefvoid fun 2()prin tf("a = %dn", a);I/prin tf("b = %dn", b);int mai
36、 n()fun 1();fun 2(); return 0;5結(jié)論C語(yǔ)言中的const變量C語(yǔ)言中con st變量是只讀變量,有自己的存儲(chǔ)空間C+中的con st常量可能分配存儲(chǔ)空間,也可能不分配存儲(chǔ)空間當(dāng)const常量為全局,并且需要在其它文件中使用,會(huì)分配存儲(chǔ)空間 當(dāng)使用&操作符,取con st常量的地址時(shí),會(huì)分配存儲(chǔ)空間當(dāng)const int &a = 10; const修飾引用時(shí),也會(huì)分配存儲(chǔ)空間6引用專題講座1引用(普通引用)變量名回顧變量名實(shí)質(zhì)上是一段連續(xù)存儲(chǔ)空間的別名,是一個(gè)標(biāo)號(hào)(門牌號(hào))程序中通過變量來(lái)申請(qǐng)并命名內(nèi)存空間通過變量的名字可以使用存儲(chǔ)空間 問題1:對(duì)一
37、段連續(xù)的內(nèi)存空間只能取一個(gè)別名嗎?1引用概念a)在C+沖新增加了引用的概念b)引用可以看作一個(gè)已定義變量的別名c)引用的語(yǔ)法: Type& n ame = var;d)引用做函數(shù)參數(shù)那?(引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化)void mai n01()int a = 10; /c編譯器分配4個(gè)字節(jié)內(nèi)存。a內(nèi)存空間的別名int &b = a; b就是a的別名。a =11; /直接賦值int *p = &a;*p = 12;printf("a %d n",a);b = 14;printf("a:%d b:%d", a, b); sys
38、tem("pause");2弓I用是C+的概念屬于C+編譯器對(duì)c的擴(kuò)展 問題:C中可以編譯通過嗎?int main()int a = 0;int &b = a; int * const b = &ab = 11; /*b = 11;return 0;結(jié)論:請(qǐng)不要用C的語(yǔ)法考慮b=113引用做函數(shù)參數(shù)普通引用在聲明時(shí)必須用其它的變量進(jìn)行初始化, 引用作為函數(shù)參數(shù)聲明時(shí)不進(jìn)行初始化/05復(fù)雜數(shù)據(jù)類型的引用struct Teacherchar n ame64;int age ;void prin tfT(Teacher *pT)cout<<pT->
39、;age<<e ndl;/pT是t1的別名,相當(dāng)于修改了 t1void prin tfT2(Teacher & pT)cout<<pT.age<<e ndl;pT.age = 33;pT和t1的是兩個(gè)不同的變量void prin tfT3(Teacher pT)cout<<pT.age<<e ndl;pT.age = 45; /只會(huì)修改pT變量,不會(huì)修改t1變量void mai n()Teacher t1;t1.age = 35;printfT(& t1);printfT2(t1); /pT 是t1 的別名printf
40、("t1.age:%d n", t1.age); 33printfT3(t1) ;/ pT 是形參,t1 copy一份數(shù)據(jù)給 pT /-> pT = t1printf("t1.age:%d n", t1.age); /35cout<<"hello."<<e ndl;system("pause");return ;4引用的意義1)引用作為其它變量的別名而存在,因此在一些場(chǎng)合可以代替指針2)引用相對(duì)于指針來(lái)說具有更好的可讀性和實(shí)用性int swgpl (ini 込 int &b)
41、(int t = a;a = b;b = t;return 0±-int swap2 (int int(int t = *aF*a = *b;= t;return5引用本質(zhì)思考思考1: C+編譯器背后做了什么工作?int mai n()int a = 10;int &b = a;b是a的別名,請(qǐng)問c+編譯器后面做了什么工作?b = 11;cout<v"b->"vvavve ndl;pri ntf("a:%dn", a);pri ntf("b:%din", b);pri ntf(“&a:%dn&qu
42、ot;, & a);pri ntf("&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;引用是一個(gè)有地址,
43、引用是常量。char *const p6引用的本質(zhì)1)引用在C+中的內(nèi)部實(shí)現(xiàn)是一個(gè)常指針Type& n ameType* const n ame2)C+編譯器在編譯過程中使用常指針作為引用的內(nèi)部實(shí)現(xiàn),因此引用所占用的空間大 小與指針相同。3) 從使用的角度,引用會(huì)讓人誤會(huì)其只是一個(gè)別名,沒有自己的存儲(chǔ)空間。這是C+為 了實(shí)用性而做出的細(xì)節(jié)隱藏void func(int &a)void func(int *const 呂)a = 5;- 5Int mai n()int x = 10;fun c(x);4)請(qǐng)仔細(xì)對(duì)比間接賦值成立的三個(gè)條件 1定義兩個(gè)變量(一個(gè)實(shí)參一個(gè)形參) 2建立
44、關(guān)聯(lián)實(shí)參取地址傳給形參 3*p形參去間接的修改實(shí)參的值7引用結(jié)論1)引用在實(shí)現(xiàn)上,只不過是把:間接賦值成立的三個(gè)條件的后兩步和二為一/當(dāng)實(shí)參傳給形參引用的時(shí)候,只不過是C+編譯器幫我們程序員手工取了一個(gè)實(shí)參地址,傳給了形參引用(常量指針)2)當(dāng)我們使用引用 語(yǔ)法的時(shí),我們不去關(guān)心編譯器引用是怎么做的當(dāng)我們分析奇怪的語(yǔ)法現(xiàn)象的時(shí),我們才去考慮C+編譯器是怎么做的8函數(shù)返回值是引用(引用當(dāng)左值)C+引用使用時(shí)的難點(diǎn):當(dāng)函數(shù)返回值為引用時(shí)若返回棧變量不能成為其它引用的初始值 不能作為左值使用若返回靜態(tài)變量或全局變量可以成為其他引用的初始值即可作為右值使用,也可作為左值使用C+鏈?zhǔn)骄幊讨?,?jīng)常用到引用
45、,運(yùn)算符重載專題返回值是基礎(chǔ)類型,當(dāng)引用in t getAA1()int a;a = 10;return a;/基礎(chǔ)類型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 +;pr
46、intf("a:%d n", a); return a;int *j2()static int a = 10;a +;printf("a:%d n", a);return &a;void mai n22()/ 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("
47、;pause");返回值是形參,當(dāng)引用int g1(i nt *p)*p = 100; return *p;int& g2(i nt *p) / *p = 100; return *p;/當(dāng)我們使用引用語(yǔ)法的時(shí)候,我們不去關(guān)心編譯器引用是怎么做的/當(dāng)我們分析亂碼這種現(xiàn)象的時(shí)候,我們才去考慮C+編譯器是怎么做的。void mai n23()int a1 = 10;a1 = g2(&a1);int &a2 = g2(&a1); /用引用去接受函數(shù)的返回值,是不是亂碼,關(guān)鍵是看返回的內(nèi)存空 間是不是被編譯器回收了。printf("a1:%d n&q
48、uot;, a1);printf("a2:%d n", a2);system("pause");返回值非基礎(chǔ)類型struct Teacharchar n ame64;int age;;/如果返回引用不是基礎(chǔ)類型,是一個(gè)類,那么情況非常賦值。涉及到copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teacharchar n ame64;int age;;/如果返回引用不是基礎(chǔ)類型,是一個(gè)類,那么情況非常賦值。涉及到copy構(gòu)造函數(shù)和=操作重載,拋磚。struct Teachar & OpTeacher(struct Teachar &t1)
49、9指針引用#i nclude "iostream"using n amespace std;struct Teacherchar n ame64;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
50、*)malloc(sizeof(Teacher); myp->age = 34;return 0;void mai n333()Teacher *p = NULL;/getTe(&p); getTe2(p);prin tf("age:%d n", p->age); system("pause");2常引用下面開始進(jìn)入con st引用難點(diǎn)1使用變量初始化const引用思考 cost int &a = b PK con st int &a = 10;?問題:const引用, 在C+中可以聲明con st引用const Ty
51、pe & n ame = var ;con st引用讓變量擁有只讀屬性案例1:int main()int a = 10;constint &b = a;/ int *p = ( int *)&b;b = 11; /err*p = 11; / 只能用指針來(lái)改變了cout« "b->" vva<<endl;printf( "a:%dn" , a);printf( "b:%dn" , b);printf( "&a:%dn" , &a);printf( &
52、quot;&b:%dn" , &b);system( "pause");return 0;案例2:void mai n41()int a = 10;const int&b = a; / const引用使用變量a初始化 a = 11;/b = 12; / 通過引用修改a,對(duì)不起修改不了 system("pause");struct Teacher1char n ame64;int age;void prin tTe2(c onst Teacher1 *const pt)/const引用讓變量(所指內(nèi)存空間)擁有只讀屬性vo
53、id prin tTe(c onst Teacher1 &t)/t.age = 11;void mai n42()Teacher1 t1;t1.age = 33;prin tTe(t1);system("pause");2使用字面量常量初始化const弓I用思考:1、 用變量對(duì)const引用初始化,const引用分配內(nèi)存空間了嗎?2、 用常量對(duì)const引用初始化,const引用分配內(nèi)存空間了嗎? void mai n()const int b = 10;pri ntf("b:%d", & b);/int &a1 = 19; 如果
54、不加con st編譯失敗const int &a = 19;printf("&a:%d n", &a);system("pause");3綜合案例void mai n()/普通引用int a = 10;int &b = a;/常量引用:讓變量引用只讀屬性const int &c = a;/常量引用初始化分為兩種/1用變量初始化常量引用int x = 20;const int& y = x; prin tf("y:%d n", y);/2用常量初始化常量引用/int &m = 10
55、; /引用是內(nèi)存空間的別名字面量10沒有內(nèi)存空間沒有方法做引用const int &m = 10; cout<<"hello."<<e ndl; system("pause"); return ;3 const引用結(jié)論1)Co nst & int e 相當(dāng)于 const int * con st e2)普通引用相當(dāng)于 int *con st e13) 當(dāng)使用常量(字面量)對(duì) con st引用進(jìn)行初始化時(shí),C+編譯器會(huì)為常量值分配空間, 并將引用名作為這段空間的別名4)使用字面量對(duì)con st引用初始化后,將生成一個(gè)
56、只讀變量4const修飾類后續(xù)課程介紹5綜合練習(xí)in t&j()static int a = 0; return a;int& g()int a = 0; return a;int mai n()int a = g(); int& b = g();j() = 10;prin tf("a = %dn", a); prin tf("b = %dn", b);prin tf("f() = %dn", f(); system("pause");return 0;7C+對(duì)C的函數(shù)擴(kuò)展1 inline內(nèi)
57、聯(lián)函數(shù)C+中的const常量可以替代宏常數(shù)定義,如:const int A = 3; #define A 3C+沖是否有解決方案替代宏代碼片段呢?(替代宏代碼片段就可以避免宏的副作用!)C+中推薦使用內(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é)合在一起,否則編譯器會(huì)直接忽略內(nèi)聯(lián)請(qǐng)求。 /宏替換和函數(shù)調(diào)用區(qū)別#i nclude "iostream"using n amespace std;#defi ne MYFUNC(a, b) (a) < (b) ?:(b)in li ne int myfun c(i nt a,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職第三學(xué)年(海綿城市建設(shè)技術(shù))海綿設(shè)施施工階段測(cè)試題及答案
- 2025年大學(xué)二年級(jí)(網(wǎng)絡(luò)媒體UI設(shè)計(jì))UI應(yīng)用階段測(cè)試題及答案
- 2025年大學(xué)第四學(xué)年(數(shù)字媒體技術(shù))數(shù)字媒體交互設(shè)計(jì)試題及答案
- 2025年大學(xué)第四學(xué)年(工業(yè)設(shè)計(jì))產(chǎn)品結(jié)構(gòu)設(shè)計(jì)綜合試題及答案
- 2025年高職老年保健與管理(老年?duì)I養(yǎng)與膳食)試題及答案
- 2025年中職(新能源汽車檢測(cè)與維修)智能駕駛輔助設(shè)備基礎(chǔ)試題及答案
- 2025年高職(酒店管理綜合實(shí)訓(xùn))服務(wù)創(chuàng)新實(shí)操試題及答案
- 2026年幼兒教育(幼兒語(yǔ)言表達(dá))試題及答案
- 2025年高職老年人服務(wù)與管理(心理疏導(dǎo)方法)試題及答案
- 2025年高職模具設(shè)計(jì)與制造(模具設(shè)計(jì)制造應(yīng)用)試題及答案
- 收購(gòu)軟件的合同范本
- 2025年榮昌縣輔警招聘考試真題含答案詳解ab卷
- 新能源公司安全生產(chǎn)管理制度
- 2025年江蘇省無(wú)錫市中考數(shù)學(xué)試卷(含答案與解析)
- 中國(guó)移動(dòng):面向大規(guī)模智算集群場(chǎng)景的光互連技術(shù)白皮書 2025
- 標(biāo)準(zhǔn)化會(huì)議組織與執(zhí)行流程
- 2025年秋招機(jī)械工程師筆試真題及答案
- 圓柱齒輪減速機(jī)維修課件
- 河道整治施工過程中的風(fēng)險(xiǎn)控制方案
- 儲(chǔ)備園長(zhǎng)筆試題目及答案
- 鐵路運(yùn)輸安全管理體系建設(shè)方案
評(píng)論
0/150
提交評(píng)論