傳智播客C基礎課程講義(共150頁)_第1頁
傳智播客C基礎課程講義(共150頁)_第2頁
傳智播客C基礎課程講義(共150頁)_第3頁
傳智播客C基礎課程講義(共150頁)_第4頁
傳智播客C基礎課程講義(共150頁)_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上傳智播客C+課程講義 傳智掃地僧1、C+對C的擴展1簡單的C+程序1.1求圓的周長和面積 數(shù)據(jù)描述:半徑,周長,面積均用實型數(shù)表示數(shù)據(jù)處理:輸入半徑 r;計算周長 = 2*r ;計算面積 = * r2 ;輸出半徑,周長,面積;方法1:用結構化方法編程,求圓的周長和面積 / 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 <&l

2、t; "Please 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 ;

3、方法2:用面向?qū)ο蠓椒ň幊?,求圓的周長和面積#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ù)設置成員變量 double Get_Girth() return 2 * 3.14f * radius ; /通過成員函數(shù)獲取成員變量 double Get_Area() return 3

4、.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()

5、 << endl ; 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 ; 總結:建立類、對象、成員變量、成員函數(shù),輸入輸入流基本概念。1.2初

6、學者易犯錯誤模型/ demo02_circle_err.cpp#include<iostream>using namespace std;/c+的命名空間class circlepublic:double r;double pi = 3.;double area = pi*r*r;int main()circle pi;cout << "請輸入area" << endl;cin >> pi.r;cout << pi.area << endl;/亂碼system("pause");re

7、turn 0;總結:從內(nèi)存四區(qū)的角度,解釋為什么會出現(xiàn)亂碼理解為什么需要成員函數(shù)2程序設計方法的發(fā)展歷程面向過程的結構化程序設計方法 l 設計思路 自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。l 程序結構: 按功能劃分為若干個基本模塊,形成一個樹狀結構。 各模塊間的關系盡可能簡單,功能上相對獨立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結構組成。 其模塊化實現(xiàn)的具體方法是使用子程序。l 優(yōu)點:有效地將一個較復雜的程序系統(tǒng)設計任務分解成許多易于控制和處理的子任務,便于開發(fā)和維護。l 缺點:可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應用軟件 把數(shù)據(jù)和處理數(shù)據(jù)的過程

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

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

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

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

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

13、向?qū)ο蟮脑O計方法,而第一個需要解決的問題就是:高效的面向?qū)ο笳Z言,并且能夠兼容已經(jīng)存在的代碼。C語言 + 面向?qū)ο蠓椒ㄕ?Objective C /C+C語言和C+并不是對立的競爭關系C+是C語言的加強,是一種更好的C語言C+是以C語言為基礎的,并且完全兼容C語言的特性學習C+并不會影響原有的C語言知識,相反會根據(jù)加深對C的認知;學習C+可以接觸到更多的軟件設計方法,并帶來更多的機會。1) C+是一種更強大的C,通過學習C+能夠掌握更多的軟件設計方法2) C+是Java/C#/D等現(xiàn)代開發(fā)語言的基礎,學習C+后能夠快速掌握這些語言3)C+是各大知名軟件企業(yè)挑選人才的標準之一 4 C+對C的加強

14、4.1 namespace命名空間1 C+命名空間基本常識所謂namespace,是指標識符的各種可見范圍。C+標準程序庫中的所有標識符都被定義于一個名為std的namespace中。一 :<iostream>和<iostream.h>格式不一樣,前者沒有后綴,實際上,在你的編譯器include文件夾里面可以看到,二者是兩個文件,打開文件就會發(fā)現(xiàn),里面的代碼是不一樣的。后綴為.h的頭文件c+標準已經(jīng)明確提出不支持了,早些的實現(xiàn)將標準庫功能定義在全局空間里,聲明在帶.h后綴的頭文件里,c+標準為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定頭文件不使用后綴.h。 因此,1)當

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

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

17、所造成的名字沖突,就把標準庫中的一切都被放在名字空間std中。但這又會帶來了一個新問 題。無數(shù)原有的C+代碼都依賴于使用了多年的偽標準庫中的功能,他們都是在全局空間下的。所以就有了<iostream.h> 和<iostream>等等這樣的頭文件,一個是為了兼容以前的C+代碼,一個是為了支持新的標準。命名空間std封裝的是標準程序庫的名稱,標準程序庫為了和以前的頭文件區(qū)別,一般不加".h"2 C+命名空間定義及使用語法/*在C+中,名稱(name)可以是符號常量、變量、宏、函數(shù)、結構、枚舉、類和對象等等。為了避免,在大規(guī)模程序的設計中,以及在程序員使用

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

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

20、paceCstruct Teacherchar name10;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(&

21、quot;t1.age = %dn", t1.age);system("pause");return 0;4 結論1) 當使用<iostream>的時候,該沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。若不引入using namespace std ,需要這樣做。std:cout。2) c+標準為了和C區(qū)別開,也為了正確使用命名空間,規(guī)定不使用后綴.h。3) C+命名空間的定義:namespace name 4) using namespace NameSpaceA;5) namespce定義可嵌套。4.2 “實用

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

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

24、uot;pause");return 0;其他補充:請閱讀register關鍵字常識課外閱讀.docx4.4變量檢測增強/*在C語言中,重復定義多個同名的全局變量是合法的在C+中,不允許定義多個同名的全局變量C語言中多個同名的全局變量最終會被鏈接到全局數(shù)據(jù)區(qū)的同一個地址空間上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類型加強 struct類型的加強:C語言的struct定

25、義了一組變量的集合,C編譯器并不認為這是一種新的類型C+中的struct是一個新類型的定義聲明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語言中的默認類型在C+中是不合法的函數(shù)f的返回值是什么類型,參數(shù)又是什么類型?函數(shù)g可以接受多少個參數(shù)?*/更換成.cpp試試f(i

26、)printf("i = %dn", i);g()return 5;int main(int argc, char *argv)f(10);printf("g() = %dn", g(1, 2, 3, 4, 5);getchar();return 0;總結:/*在C語言中int f( );表示返回值為int,接受任意參數(shù)的函數(shù)int f(void);表示返回值為int的無參函數(shù)在C+中int f( );和int f(void)具有相同的意義,都表示返回值為int的無參函數(shù)*/C+更加強調(diào)類型,任意的程序元素都必須顯示指明類型4.2-4.6屬于語法級別的增

27、強。4.7新增Bool類型關鍵字 /*C+中的布爾類型C+在C語言的基本類型系統(tǒng)之上增加了boolC+中的bool可取的值只有true和false理論上bool只占用一個字節(jié),如果多個bool變量定義在一起,可能會各占一個bit,這取決于編譯器的實現(xiàn)true代表真值,編譯器內(nèi)部用1來表示false代表非真值,編譯器內(nèi)部用0來表示bool類型只有true(非0)和false(0)兩個值C+編譯器會在賦值時將非0值轉換為true,0值轉換為false*/int main(int argc, char *argv)int a;bool b = true;printf("b = %d, si

28、zeof(b) = %dn", b, sizeof(b);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三目運算符功能增強1三目運算符在C和C+編譯器的表現(xiàn)

29、int main()int a = 10;int b = 20;/返回一個最小數(shù) 并且給最小數(shù)賦值成3/三目運算符是一個表達式 ,表達式不可能做左值(a < b ? a : b )= 30;printf("a = %d, b = %dn", a, b); system("pause");return 0;2結論 1)C語言返回變量的值 C+語言是返回變量本身C語言中的三目運算符返回的是變量值,不能作為左值使用C+中的三目運算符可直接返回變量本身,因此可以出現(xiàn)在程序的任何地方2)注意:三目運算符可能返回的值中如果有一個是常量值,則不能作為左值使用(a

30、 < b ? 1 : b )= 30;3)C語言如何支持類似C+的特性呢?=>當左值的條件:要有內(nèi)存空間;C+編譯器幫助程序員取了一個地址而已思考:如何讓C中的三目運算法當左值呢?5 C/C+中的const 1 const基礎知識(用法、含義、好處)int main()const int a;int const b;const int *c;int * const d;const int * const e ;return 0;Int func1(const )初級理解:const是定義常量=const意味著只讀含義:/第一個第二個意思一樣 代表一個常整形數(shù)/第三個 c是一個指向常

31、整形數(shù)的指針(所指向的內(nèi)存數(shù)據(jù)不能被修改,但是本身可以修改)/第四個 d 常指針(指針變量不能被修改,但是它所指向內(nèi)存空間可以被修改)/第五個 e一個指向常整形的常指針(指針和它所指向的內(nèi)存空間,均不能被修改)Const好處/合理的利用const,/1指針做函數(shù)參數(shù),可以有效的提高代碼可讀性,減少bug;/2清楚的分清參數(shù)的輸入和輸出特性int setTeacher_err( const Teacher *p)Const修改形參的時候,在利用形參不能修改指針所向的內(nèi)存空間2 C中“冒牌貨”int main()const int a = 10;int *p = (int*)&a; pri

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

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

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

35、定義的b,在func2中能使用嗎?練習void 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 結論C語言中的const變量C語言中const變量是只讀變量,有自己的存儲空間C+中的const常量可能分配存儲空間,也可能不分配存儲空間 當const常量為全局,并且需要在其它文件中使用,會分配存儲空間當使用&a

36、mp;操作符,取const常量的地址時,會分配存儲空間當const int &a = 10; const修飾引用時,也會分配存儲空間6引用專題講座1引用(普通引用)變量名回顧變量名實質(zhì)上是一段連續(xù)存儲空間的別名,是一個標號(門牌號) 程序中通過變量來申請并命名內(nèi)存空間 通過變量的名字可以使用存儲空間問題1:對一段連續(xù)的內(nèi)存空間只能取一個別名嗎?1 引用概念a) 在C+中新增加了引用的概念b) 引用可以看作一個已定義變量的別名c) 引用的語法:Type& name = var; d) 引用做函數(shù)參數(shù)那?(引用作為函數(shù)參數(shù)聲明時不進行初始化)void main01()int a =

37、 10; /c編譯器分配4個字節(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);system("pause");2 引用是C+的概念 屬于C+編譯器對C的擴展問題:C中可以編譯通過嗎?int main()int a = 0;int &b = a; /int * const b = &a b = 11; /*b = 11;

38、return 0;結論:請不要用C的語法考慮 b=113 引用做函數(shù)參數(shù) 普通引用在聲明時必須用其它的變量進行初始化,引用作為函數(shù)參數(shù)聲明時不進行初始化/05復雜數(shù)據(jù)類型 的引用struct Teacherchar name64;int age ;void printfT(Teacher *pT)cout<<pT->age<<endl;/pT是t1的別名 ,相當于修改了t1void printfT2(Teacher &pT)/cout<<pT.age<<endl;pT.age = 33;/pT和t1的是兩個不同的變量void pri

39、ntfT3(Teacher pT)cout<<pT.age<<endl;pT.age = 45; /只會修改pT變量 ,不會修改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&

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

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

42、izeof(Teacer);system("pause");return 0;引用是一個有地址,引用是常量。char *const p6 引用的本質(zhì)1)引用在C+中的內(nèi)部實現(xiàn)是一個常指針Type& name çèType* const name2)C+編譯器在編譯過程中使用常指針作為引用的內(nèi)部實現(xiàn),因此引用所占用的空間大小與指針相同。3)從使用的角度,引用會讓人誤會其只是一個別名,沒有自己的存儲空間。這是C+為了實用性而做出的細節(jié)隱藏Int main()int x = 10;func(x);4) 請仔細對比間接賦值成立的三個條件1定義兩個變量 (

43、一個實參一個形參)2建立關聯(lián) 實參取地址傳給形參3*p形參去間接的修改實參的值7引用結論 1)引用在實現(xiàn)上,只不過是把:間接賦值成立的三個條件的后兩步和二為一/當實參傳給形參引用的時候,只不過是c+編譯器幫我們程序員手工取了一個實參地址,傳給了形參引用(常量指針)2)當我們使用引用語法的時,我們不去關心編譯器引用是怎么做的當我們分析奇怪的語法現(xiàn)象的時,我們才去考慮c+編譯器是怎么做的8函數(shù)返回值是引用(引用當左值)C+引用使用時的難點:當函數(shù)返回值為引用時若返回棧變量不能成為其它引用的初始值不能作為左值使用若返回靜態(tài)變量或全局變量可以成為其他引用的初始值即可作為右值使用,也可作為左值使用C+鏈

44、式編程中,經(jīng)常用到引用,運算符重載專題返回值是基礎類型,當引用int getAA1()int a;a = 10;return a;/基礎類型a返回的時候,也會有一個副本int& getAA2()int a;a = 10;return a;int* getAA3()int a;a = 10;return &a;返回值是static變量,當引用/static修飾變量的時候,變量是一個狀態(tài)變量int j()static int a = 10;a +;printf("a:%d n", a);return a;int& j1()static int a = 1

45、0;a +;printf("a:%d n", a);return a;int *j2()static int a = 10;a +;printf("a:%d n", a);return &a; void main22()/ j()的運算結果是一個數(shù)值,沒有內(nèi)存地址,不能當左值。/11 = 100;/*(a>b?&a:&b) = 111;/當被調(diào)用的函數(shù)當左值的時候,必須返回一個引用。j1() = 100; /編譯器幫我們打造了環(huán)境j1();*(j2() = 200; /相當于我們程序員手工的打造 做左值的條件j2();sys

46、tem("pause");返回值是形參,當引用int g1(int *p)*p = 100;return *p;int& g2(int *p) /*p = 100;return *p;/當我們使用引用語法的時候 ,我們不去關心編譯器引用是怎么做的/當我們分析亂碼這種現(xiàn)象的時候,我們才去考慮c+編譯器是怎么做的。void main23()int a1 = 10;a1 = g2(&a1);int &a2 = g2(&a1); /用引用去接受函數(shù)的返回值,是不是亂碼,關鍵是看返回的內(nèi)存空間是不是被編譯器回收了。printf("a1:%d

47、n", a1);printf("a2:%d n", a2);system("pause");返回值非基礎類型 struct Teacharchar name64;int age;/如果返回引用不是基礎類型,是一個類,那么情況非常賦值。涉及到copy構造函數(shù)和=操作重載,拋磚。struct Teacharchar name64;int age;/如果返回引用不是基礎類型,是一個類,那么情況非常賦值。涉及到copy構造函數(shù)和=操作重載,拋磚。struct Teachar & OpTeacher(struct Teachar &t1)

48、9指針引用 #include "iostream"using namespace std;struct 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 *)

49、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常引用下面開始進入const引用難點1 使用變量初始化const引用 思考cost int &a = b PK const int &a = 10;?問題:const引用,在C+中可以聲明const引用const Type& na

50、me = var;const引用讓變量擁有只讀屬性 案例1:int main()int a = 10;const 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:%d

51、n", &b);system("pause");return 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 Teach

52、er1 &t)/t.age = 11;void main42()Teacher1 t1;t1.age = 33;printTe(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;

53、printf("&a:%d n", &a);system("pause");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)存空間 沒

54、有方法做引用const int &m = 10; cout<<"hello."<<endl;system("pause");return ;3 const引用結論 1)Const & int e 相當于 const int * const e2)普通引用 相當于 int *const e13)當使用常量(字面量)對const引用進行初始化時,C+編譯器會為常量值分配空間,并將引用名作為這段空間的別名4)使用字面量對const引用初始化后,將生成一個只讀變量4const修飾類 后續(xù)課程介紹5綜合練習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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論