版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)本章主要內(nèi)容本章主要內(nèi)容l作用域與可見(jiàn)性作用域與可見(jiàn)性l對(duì)象的生存期對(duì)象的生存期l數(shù)據(jù)與函數(shù)數(shù)據(jù)與函數(shù)l靜態(tài)成員靜態(tài)成員l共享數(shù)據(jù)的保護(hù)共享數(shù)據(jù)的保護(hù)l友元友元l編譯預(yù)處理命令編譯預(yù)處理命令l多文件結(jié)構(gòu)和工程多文件結(jié)構(gòu)和工程第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)5.1 面向?qū)ο蟪绦虻慕Y(jié)構(gòu)面向?qū)ο蟪绦虻慕Y(jié)構(gòu) 5.1.1 作用域和生存期作用域和生存期 1. 作用域作用域 1) 函數(shù)原型作用域函數(shù)原型作用域 函數(shù)原型作用域開(kāi)始于函數(shù)原型聲明的左括號(hào)函數(shù)原型作用域開(kāi)始于函數(shù)原型聲明的左括號(hào)“(”,結(jié),結(jié)束于右括號(hào)束于右括號(hào)“)”。例如:。例如:double Are
2、a(double length, double width); 函數(shù)原型作用域是函數(shù)原型作用域是C+程序中最小的作用域。程序中最小的作用域。 由于形參由于形參length和和width只在括號(hào)之內(nèi)有效,在程序的只在括號(hào)之內(nèi)有效,在程序的其它地方無(wú)法引用這個(gè)標(biāo)識(shí)符,如果要引用,必須重新定義。其它地方無(wú)法引用這個(gè)標(biāo)識(shí)符,如果要引用,必須重新定義。因此,這里的標(biāo)識(shí)符因此,這里的標(biāo)識(shí)符length和和width實(shí)際上是可有可無(wú)的,省實(shí)際上是可有可無(wú)的,省去它,也決不會(huì)影響到程序的編譯和運(yùn)行結(jié)果。例如:去它,也決不會(huì)影響到程序的編譯和運(yùn)行結(jié)果。例如:double Area(double, double)
3、;第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 塊作用域又稱(chēng)局部作用域。由一對(duì)花括號(hào)塊作用域又稱(chēng)局部作用域。由一對(duì)花括號(hào)“ ”所括起來(lái)所括起來(lái)的塊中聲明的標(biāo)識(shí)符的作用域從聲明處開(kāi)始,一直到塊結(jié)束的塊中聲明的標(biāo)識(shí)符的作用域從聲明處開(kāi)始,一直到塊結(jié)束的花括號(hào)為止。例如:的花括號(hào)為止。例如: #includevoid main( ) void fun1( ) ; int n; for( int i=0 ; i5; i+ ) int m ; if( i%2 ) n+ ; m = n/2 ;/錯(cuò)誤,錯(cuò)誤,m未定義未定義 n = i ; fun1( ) ; /fun1( )函數(shù)調(diào)用函數(shù)調(diào)用 2) 塊作用域塊作用
4、域第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) void fun1( ) couti=iendl ; /錯(cuò)誤,錯(cuò)誤,i未定義未定義 編譯時(shí),函數(shù)編譯時(shí),函數(shù)fun1( )中的語(yǔ)句:中的語(yǔ)句: couti=iendl;將出現(xiàn)一個(gè)未定義錯(cuò)誤,這是因?yàn)閷⒊霈F(xiàn)一個(gè)未定義錯(cuò)誤,這是因?yàn)閴K作用域不能延伸到子函數(shù)塊作用域不能延伸到子函數(shù)中中。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)3) 文件作用域文件作用域 #includeint k;void main() k=5; k+; int k=7; k+; coutk=k; cout“, k=kendl; 程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:k=8, k=6可見(jiàn)性遵循的一般
5、規(guī)則:可見(jiàn)性遵循的一般規(guī)則:(1) 標(biāo)識(shí)符在標(biāo)識(shí)符在引用前必須先聲明引用前必須先聲明。(2) 在互相沒(méi)有包含關(guān)系的在互相沒(méi)有包含關(guān)系的不同作用域不同作用域中聲明同名的標(biāo)識(shí)符時(shí),中聲明同名的標(biāo)識(shí)符時(shí), 兩標(biāo)識(shí)符兩標(biāo)識(shí)符互不影響互不影響。(3) 如果在兩個(gè)或多個(gè)具有包含關(guān)系的作用域中聲明了如果在兩個(gè)或多個(gè)具有包含關(guān)系的作用域中聲明了同名標(biāo)識(shí)同名標(biāo)識(shí) 符符,則,則外層標(biāo)識(shí)符在內(nèi)層不可見(jiàn)外層標(biāo)識(shí)符在內(nèi)層不可見(jiàn)。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)1) 靜態(tài)生存期靜態(tài)生存期 靜態(tài)生存期與程序的運(yùn)行期相同。具有靜態(tài)生存期與程序的運(yùn)行期相同。具有文件作用域文件作用域的變的變量具有靜態(tài)生存期。如果要在函數(shù)內(nèi)
6、部的量具有靜態(tài)生存期。如果要在函數(shù)內(nèi)部的塊作用域塊作用域中聲明具中聲明具有靜態(tài)生存期的變量,則有靜態(tài)生存期的變量,則要使用關(guān)鍵字要使用關(guān)鍵字static。 例如:例如: static int k; 具有靜態(tài)生存期的變量,也稱(chēng)為靜態(tài)變量具有靜態(tài)生存期的變量,也稱(chēng)為靜態(tài)變量。2) 局部生存期局部生存期在塊作用域中聲明的變量具有局部生存期。此生存期誕在塊作用域中聲明的變量具有局部生存期。此生存期誕生于聲明點(diǎn),而終止于其作用域的結(jié)束處。具有局部生存期生于聲明點(diǎn),而終止于其作用域的結(jié)束處。具有局部生存期的變量都具有塊作用域。但當(dāng)在塊作用域內(nèi)將變量說(shuō)明為靜的變量都具有塊作用域。但當(dāng)在塊作用域內(nèi)將變量說(shuō)明為
7、靜態(tài)變量時(shí),該變量則具有靜態(tài)生存期。態(tài)變量時(shí),該變量則具有靜態(tài)生存期。3) 動(dòng)態(tài)生存期動(dòng)態(tài)生存期動(dòng)態(tài)生存期由程序中特定的動(dòng)態(tài)生存期由程序中特定的函數(shù)函數(shù) ( malloc( )和和free( ) ) 調(diào)調(diào)用或由用或由操作符操作符 ( new和和delete ) 創(chuàng)建和釋放。具有動(dòng)態(tài)生存期創(chuàng)建和釋放。具有動(dòng)態(tài)生存期的變量在內(nèi)存的堆區(qū)分配空間。的變量在內(nèi)存的堆區(qū)分配空間。2生存期生存期第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)3局部變量和全局變量局部變量和全局變量1) 局部變量局部變量局部變量包括自動(dòng)局部變量包括自動(dòng)(auto)變量、內(nèi)部靜態(tài)變量、內(nèi)部靜態(tài)(static)變量和變量和函數(shù)參數(shù)。函數(shù)參數(shù)
8、。2) 全局變量全局變量全局變量具有文件作用域。全局變量具有文件作用域。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/EX5_1.cpp : 演示局部變量和全局變量演示局部變量和全局變量#includeint i = 1 ;/全局變量全局變量i: 靜態(tài)生存期靜態(tài)生存期void main( ) static int a ;/聲明局部靜態(tài)變量聲明局部靜態(tài)變量a: 靜態(tài)生存期靜態(tài)生存期 int b = -10 ;/聲明局部變量聲明局部變量b: 局部生存期局部生存期 int c = 0 ; /聲明局部變量聲明局部變量c: 局部生存期局部生存期 void other( void ) ;/聲明聲明函數(shù)函數(shù)oth
9、er( ) cout“ main: i=i a=a b=b c= cendl ; c = c + 8 ; other( ) ;/調(diào)用函數(shù)調(diào)用函數(shù)other( ) cout“ main: i=i a=a b=b c=cendl; other( );/調(diào)用函數(shù)調(diào)用函數(shù)other( )第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)void other( void ) static int a = 1 ;/局部靜態(tài)變量局部靜態(tài)變量a: 靜態(tài)生存期靜態(tài)生存期 static int b ;/局部靜態(tài)變量局部靜態(tài)變量b: 靜態(tài)生存期靜態(tài)生存期 int c = 5 ; /局部變量局部變量c: 局部生存期局部生存期 i
10、 = i+2 ; a = a+3 ; c = c+5 ; coutother: i=i a=a b= b c=cendl; b = a ;程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:main: i=1 a=0 b=-10 c=0other: i=3 a=4 b= 0 c=10main: i=3 a=0 b=-10 c=8other: i=5 a=7 b= 4 c=10第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 靜態(tài)成員為同類(lèi)的所有對(duì)象共同擁有,用于解決同類(lèi)對(duì)靜態(tài)成員為同類(lèi)的所有對(duì)象共同擁有,用于解決同類(lèi)對(duì)象之間數(shù)據(jù)和函數(shù)的共享問(wèn)題。靜態(tài)成員分為象之間數(shù)據(jù)和函數(shù)的共享問(wèn)題。靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員和
11、和靜態(tài)函數(shù)成員靜態(tài)函數(shù)成員。 (1) 靜態(tài)數(shù)據(jù)成員聲明:靜態(tài)數(shù)據(jù)成員聲明:static int n (2) 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員必須要必須要在類(lèi)外進(jìn)行初始化在類(lèi)外進(jìn)行初始化,初始化的形式為:,初始化的形式為: :=例如:例如:int Point:n = 0 ; (3) 靜態(tài)成員屬于類(lèi),而不屬于任何一個(gè)對(duì)象;靜態(tài)成員屬于類(lèi),而不屬于任何一個(gè)對(duì)象; (4) 靜態(tài)成員一樣要服從訪問(wèn)控制限制;靜態(tài)成員一樣要服從訪問(wèn)控制限制; (5) 私有私有靜態(tài)數(shù)據(jù)成員只能在靜態(tài)數(shù)據(jù)成員只能在類(lèi)內(nèi)引用類(lèi)內(nèi)引用,公有或保護(hù)公有或保護(hù)靜態(tài)數(shù)據(jù)靜態(tài)數(shù)據(jù) 成員可以在類(lèi)外通過(guò)成員可以在類(lèi)外通過(guò)類(lèi)名引用類(lèi)名引用。 (6) 靜
12、態(tài)函數(shù)成員可以直接引用該類(lèi)的靜態(tài)成員,但靜態(tài)函數(shù)成員可以直接引用該類(lèi)的靜態(tài)成員,但不能直接不能直接 引用非靜態(tài)數(shù)據(jù)成員引用非靜態(tài)數(shù)據(jù)成員; (7) 公有公有靜態(tài)函數(shù)成員可以通過(guò)類(lèi)名或?qū)ο竺麃?lái)調(diào)用。靜態(tài)函數(shù)成員可以通過(guò)類(lèi)名或?qū)ο竺麃?lái)調(diào)用。5.1.2 靜態(tài)成員靜態(tài)成員第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/EX5_2.cpp : 演示使用靜態(tài)成員演示使用靜態(tài)成員#includeclass point private: int x , y ; static int countP ; /聲明聲明私有靜態(tài)數(shù)據(jù)成員私有靜態(tài)數(shù)據(jù)成員 public: point( int xx=0, int yy=0 )/定
13、義構(gòu)造函數(shù)定義構(gòu)造函數(shù) x=xx ; y=yy ; countP+ ; point( point &p ) ;/聲明拷貝構(gòu)造函數(shù)聲明拷貝構(gòu)造函數(shù) int get_x( ) return x ; int get_y( ) return y ; static void get_c( ) /定義定義公有靜態(tài)函數(shù)成員公有靜態(tài)函數(shù)成員 cout“Object id=”countPendl ; /私有靜態(tài)數(shù)據(jù)成私有靜態(tài)數(shù)據(jù)成; /員在類(lèi)內(nèi)引用員在類(lèi)內(nèi)引用第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)point:point( point &p )/定義拷貝構(gòu)造函數(shù)定義拷貝構(gòu)造函數(shù) x = p.x ;
14、 y = p.y ; countP+ ;/私有靜態(tài)數(shù)據(jù)成員在私有靜態(tài)數(shù)據(jù)成員在類(lèi)內(nèi)引用類(lèi)內(nèi)引用int point:countP = 0 ;/靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員必須要必須要在類(lèi)外初始化在類(lèi)外初始化void main( ) point:get_c( ) ;/第第1次通過(guò)次通過(guò)類(lèi)類(lèi)名調(diào)用靜態(tài)函數(shù)成員名調(diào)用靜態(tài)函數(shù)成員 point a( 4, 5 ) ;/聲明類(lèi)的對(duì)象聲明類(lèi)的對(duì)象a coutpoint a,a.get_x( ),a.get_y( ); a.get_c( ) ;/第第2次通過(guò)次通過(guò)對(duì)象對(duì)象名調(diào)用靜態(tài)函數(shù)成員名調(diào)用靜態(tài)函數(shù)成員 point b( a ) ; coutpoint b,b
15、.get_x( ),b.get_y( ) ; point:get_c( );/第第3次通過(guò)次通過(guò)類(lèi)類(lèi)名調(diào)用靜態(tài)函數(shù)成員名調(diào)用靜態(tài)函數(shù)成員第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 在主函數(shù)中,分別采用類(lèi)名和對(duì)象名來(lái)調(diào)用在主函數(shù)中,分別采用類(lèi)名和對(duì)象名來(lái)調(diào)用get_c( )。 第第1次調(diào)用次調(diào)用get_c( )時(shí)由于還沒(méi)有任何對(duì)象生成,只能采用時(shí)由于還沒(méi)有任何對(duì)象生成,只能采用類(lèi)名的形式。由此可見(jiàn),類(lèi)名的形式。由此可見(jiàn),通過(guò)類(lèi)名調(diào)用靜態(tài)函數(shù)成員可以輸出通過(guò)類(lèi)名調(diào)用靜態(tài)函數(shù)成員可以輸出靜態(tài)數(shù)據(jù)成員的初始值靜態(tài)數(shù)據(jù)成員的初始值。 后面的后面的2次次get_c( )的調(diào)用既可以采用類(lèi)名的形式,也可以的調(diào)用
16、既可以采用類(lèi)名的形式,也可以采用對(duì)象名的形式。采用對(duì)象名的形式。 程序運(yùn)行結(jié)果為程序運(yùn)行結(jié)果為:Object id = 0point a, 4, 5 Object id=1point b, 4, 5 Object id=2第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 聲明友元函數(shù)是為了使普通函數(shù)或聲明友元函數(shù)是為了使普通函數(shù)或其它類(lèi)的其它類(lèi)的成員函數(shù)能成員函數(shù)能訪問(wèn)本類(lèi)的成員,友元函數(shù)在類(lèi)聲明中由關(guān)鍵字訪問(wèn)本類(lèi)的成員,友元函數(shù)在類(lèi)聲明中由關(guān)鍵字friend修飾。修飾。普通函數(shù)聲明為友元函數(shù)的形式:普通函數(shù)聲明為友元函數(shù)的形式:friend (參數(shù)表參數(shù)表)其它類(lèi)的其它類(lèi)的成員函數(shù)聲明為友元函數(shù)的形式
17、:成員函數(shù)聲明為友元函數(shù)的形式:friend :(參數(shù)表參數(shù)表) 說(shuō)明:說(shuō)明:(1) 友元函數(shù)的聲明可以在類(lèi)聲明中的任何位置,既可在友元函數(shù)的聲明可以在類(lèi)聲明中的任何位置,既可在public區(qū),也可在區(qū),也可在protected區(qū),意義完全一樣。區(qū),意義完全一樣。(2) 友元函數(shù)的定義一般放在類(lèi)的外部,最好與類(lèi)的其他友元函數(shù)的定義一般放在類(lèi)的外部,最好與類(lèi)的其他成員函數(shù)定義放在一起。成員函數(shù)定義放在一起。5.1.3 友元友元 1. 友元函數(shù)友元函數(shù)第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/EX5_3.cpp : 演示使用普通函數(shù)作友元函數(shù)計(jì)算兩點(diǎn)距離演示使用普通函數(shù)作友元函數(shù)計(jì)算兩點(diǎn)距離#inc
18、lude#includeclass point private: double x, y ; public: point(double xx=0, double yy=0 ) x=xx; y=yy; double get_x( ) return x; double get_y( ) return y; friend double distance( point p1, point p2 ) ; /普通函數(shù)作普通函數(shù)作; /point的友元的友元第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)double distance( point p1, point p2 ) /定義定義point類(lèi)的友元函數(shù)類(lèi)的友
19、元函數(shù) return (sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);void main( ) point myp1(1,1), myp2(4,5) ; /聲明聲明point類(lèi)對(duì)象類(lèi)對(duì)象myp1和和myp2 coutThe distance is:distance(myp1, myp2)endl;第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 如果友元是一個(gè)類(lèi),則稱(chēng)為友元類(lèi)。友元類(lèi)的聲明形式為:如果友元是一個(gè)類(lèi),則稱(chēng)為友元類(lèi)。友元類(lèi)的聲明形式為: friend class 說(shuō)明:說(shuō)明: (1) 友元類(lèi)的聲明同樣可以在類(lèi)聲明中的任何位置;友元類(lèi)的
20、聲明同樣可以在類(lèi)聲明中的任何位置; (2) 友元類(lèi)的所有成員函數(shù)都成為友元函數(shù)。友元類(lèi)的所有成員函數(shù)都成為友元函數(shù)。 例如,若例如,若A類(lèi)為類(lèi)為B類(lèi)的友元類(lèi),即在類(lèi)的友元類(lèi),即在B類(lèi)中聲明:類(lèi)中聲明: friend class A ;則則A類(lèi)的所有成員函數(shù)都成為類(lèi)的所有成員函數(shù)都成為B類(lèi)的友元函數(shù),都可以訪問(wèn)類(lèi)的友元函數(shù),都可以訪問(wèn)B類(lèi)類(lèi)的私有和保護(hù)成員。的私有和保護(hù)成員。2. 友元類(lèi)友元類(lèi)第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 友元類(lèi)的成員函數(shù)可以通過(guò)對(duì)象名直接訪問(wèn)到隱藏的數(shù)據(jù),友元類(lèi)的成員函數(shù)可以通過(guò)對(duì)象名直接訪問(wèn)到隱藏的數(shù)據(jù),達(dá)到高效協(xié)調(diào)工作的目的。但在使用友元時(shí)還有兩點(diǎn)需要注意:達(dá)到高
21、效協(xié)調(diào)工作的目的。但在使用友元時(shí)還有兩點(diǎn)需要注意:(1) 友元關(guān)系不能傳遞友元關(guān)系不能傳遞。B類(lèi)是類(lèi)是A類(lèi)的友元,類(lèi)的友元,C類(lèi)是類(lèi)是B類(lèi)的友類(lèi)的友 元,元,C類(lèi)和類(lèi)和A類(lèi)之間如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,類(lèi)之間如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。不能進(jìn)行數(shù)據(jù)共享。 (2) 友元關(guān)系是單向的友元關(guān)系是單向的。如果聲明。如果聲明B類(lèi)是類(lèi)是A類(lèi)的友元,類(lèi)的友元,B類(lèi)的成類(lèi)的成員函數(shù)就可以訪問(wèn)員函數(shù)就可以訪問(wèn)A類(lèi)的私有和保護(hù)數(shù)據(jù),但類(lèi)的私有和保護(hù)數(shù)據(jù),但A類(lèi)的成員函類(lèi)的成員函數(shù)卻不能訪問(wèn)數(shù)卻不能訪問(wèn)B類(lèi)的私有和保護(hù)數(shù)據(jù)。類(lèi)的私有和保護(hù)數(shù)據(jù)。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)
22、使用使用const關(guān)鍵字聲明的引用稱(chēng)為常引用,常引關(guān)鍵字聲明的引用稱(chēng)為常引用,常引用所引用的對(duì)象不能被更新。用常引用做形參,不用所引用的對(duì)象不能被更新。用常引用做形參,不會(huì)發(fā)生對(duì)實(shí)參意外的更改。會(huì)發(fā)生對(duì)實(shí)參意外的更改。 常引用的聲明形式為常引用的聲明形式為 const & 注意:注意:常引用的值不能被更新,所以常引用的值不能被更新,所以常引用聲明時(shí),常引用聲明時(shí), 必須同時(shí)進(jìn)行初始化必須同時(shí)進(jìn)行初始化。5.1.4 常類(lèi)型常類(lèi)型 1. 常引用常引用第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/EX5_4.cpp : 演示常引用做形參演示常引用做形參#includevoid display( c
23、onst double &r ) ; /常引用做形參常引用做形參 cout“r=”+rendl ; /錯(cuò)誤:更改常引用的對(duì)象錯(cuò)誤:更改常引用的對(duì)象rvoid main( ) double d( 6.5 ) ; display( d ) ; 這段程序編譯時(shí)有一個(gè)這段程序編譯時(shí)有一個(gè)錯(cuò)誤錯(cuò)誤: error C2166: 1-value specifies const object。如果將如果將display函數(shù)的定義語(yǔ)句改為函數(shù)的定義語(yǔ)句改為: coutr=rendl; 則得程序運(yùn)行結(jié)果為則得程序運(yùn)行結(jié)果為: r=6.5第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 使用使用const關(guān)鍵字聲明的
24、對(duì)象稱(chēng)為常對(duì)象。常對(duì)象的聲明關(guān)鍵字聲明的對(duì)象稱(chēng)為常對(duì)象。常對(duì)象的聲明形式為形式為 const 或或 const 聲明常對(duì)象的同時(shí),也要進(jìn)行初始化,而且該對(duì)象以后聲明常對(duì)象的同時(shí),也要進(jìn)行初始化,而且該對(duì)象以后不能再被更新。不能再被更新。3. 常成員函數(shù)常成員函數(shù)使用使用const 關(guān)鍵字聲明的函數(shù)稱(chēng)為常成員函數(shù),常成員關(guān)鍵字聲明的函數(shù)稱(chēng)為常成員函數(shù),常成員函數(shù)聲明的形式為函數(shù)聲明的形式為 (參數(shù)表參數(shù)表) const;2. 常對(duì)象常對(duì)象第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)說(shuō)明:說(shuō)明:(1) const是加在函數(shù)聲明是加在函數(shù)聲明后面后面的類(lèi)型修飾符,它是函數(shù)的類(lèi)型修飾符,它是函數(shù)類(lèi)型的一個(gè)組
25、成部分,因此在類(lèi)型的一個(gè)組成部分,因此在實(shí)現(xiàn)部分也要帶實(shí)現(xiàn)部分也要帶const關(guān)鍵關(guān)鍵字。字。(2) const關(guān)鍵字可以被關(guān)鍵字可以被用于對(duì)重載函數(shù)的區(qū)分用于對(duì)重載函數(shù)的區(qū)分,例如,例如,可以在類(lèi)中這樣聲明:可以在類(lèi)中這樣聲明:void fun( ) ;void fun( ) const ; (3) 常成員函數(shù)常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員不能更新對(duì)象的數(shù)據(jù)成員,也,也不能調(diào)用該不能調(diào)用該類(lèi)中沒(méi)有用類(lèi)中沒(méi)有用const修飾的成員函數(shù)修飾的成員函數(shù)。(4) 常對(duì)象常對(duì)象調(diào)用它的常成員函數(shù)調(diào)用它的常成員函數(shù),而不能調(diào)用其他,而不能調(diào)用其他成員函數(shù)。成員函數(shù)。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)
26、構(gòu)/EX5_5.cpp : 演示常成員函數(shù)演示常成員函數(shù)#includeclass A private: int x , y ; public: A ( int i=0, int j=0 ) x=i ; y=j ; void fun( )/定義定義普通普通成員函數(shù)成員函數(shù) cout成員函數(shù):成員函數(shù):x=x, y=yendl ; void fun( ) const/定義定義常常成員函數(shù)成員函數(shù) cout常成員函數(shù):常成員函數(shù):x=x, y=yendl ; ;void main( ) A obj1( 1, 2 ) ;/聲明普通對(duì)象聲明普通對(duì)象obj1 obj1.fun( ) ;/調(diào)用普通成員函數(shù)
27、調(diào)用普通成員函數(shù) const A obj2( 3, 4 ) ;/聲明常對(duì)象聲明常對(duì)象obj2 obj2.fun( ) ;/調(diào)用常成員函數(shù)調(diào)用常成員函數(shù)第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:成員函數(shù):成員函數(shù):x=1, y=2常成員函數(shù):常成員函數(shù):x=3, y=4 4. 常數(shù)據(jù)成員常數(shù)據(jù)成員 常數(shù)據(jù)成員也用關(guān)鍵字常數(shù)據(jù)成員也用關(guān)鍵字constconst說(shuō)明,常數(shù)據(jù)成員(包括常說(shuō)明,常數(shù)據(jù)成員(包括常引用、常對(duì)象)由于引用、常對(duì)象)由于不能被更新不能被更新,因此只能用,因此只能用成員初始化列成員初始化列表表的方式的方式通過(guò)構(gòu)造函數(shù)通過(guò)構(gòu)造函數(shù)進(jìn)行進(jìn)行初始化初始化
28、。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/EX5_6.cpp : 演示常數(shù)據(jù)成員演示常數(shù)據(jù)成員#includeclass A private: const int x ;/常數(shù)據(jù)成員常數(shù)據(jù)成員x static const int y ;/靜態(tài)常數(shù)據(jù)成員靜態(tài)常數(shù)據(jù)成員y public: const int &r ; /常引用常引用r A ( int i ) : x ( i ), r ( x ) /x和和r用用初始化列表初始化列表獲得初值獲得初值 void fun( ) coutx=x, y=y, r=rendl ; ;const int A:y=5 ;/y的初始化在類(lèi)外進(jìn)行的初始化在類(lèi)外
29、進(jìn)行第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)void main( ) A obj1(1), obj2(2); obj1.fun( ); obj2.fun( );程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:x=1, y=5, r=1x=2, y=5, r=2第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 大型程序通常由多個(gè)文件組成一個(gè)大型程序通常由多個(gè)文件組成一個(gè)項(xiàng)目項(xiàng)目(Project),理由),理由是:是:1. 將相關(guān)類(lèi)和函數(shù)放在一個(gè)特定的文件中,對(duì)不同的文件進(jìn)行將相關(guān)類(lèi)和函數(shù)放在一個(gè)特定的文件中,對(duì)不同的文件進(jìn)行單獨(dú)編寫(xiě)、編譯,最后再鏈接,避免重復(fù)勞動(dòng),提高工作單獨(dú)編寫(xiě)、編譯,最后再鏈接,避免重復(fù)勞動(dòng),提高工作
30、效益效益。2. 便于便于團(tuán)隊(duì)開(kāi)發(fā)團(tuán)隊(duì)開(kāi)發(fā)。按邏輯功能將程序分解成多個(gè)源文件,使程。按邏輯功能將程序分解成多個(gè)源文件,使程序容易管理,便于程序員的任務(wù)安排。序容易管理,便于程序員的任務(wù)安排。大型程序基本上由三個(gè)部分構(gòu)成:大型程序基本上由三個(gè)部分構(gòu)成:類(lèi)的聲明:類(lèi)的聲明: 通常做成通常做成 .h文件文件 (Header Files)類(lèi)成員的實(shí)現(xiàn):通常做成類(lèi)成員的實(shí)現(xiàn):通常做成 . cpp文件(文件(Source Files)主函數(shù):主函數(shù): 通常做成通常做成 . cpp文件(文件(Source Files)5.1.5 多文件結(jié)構(gòu)多文件結(jié)構(gòu)第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)5.2 動(dòng)態(tài)內(nèi)存分配動(dòng)
31、態(tài)內(nèi)存分配 5.2.1 new運(yùn)算符運(yùn)算符 new運(yùn)算符用于動(dòng)態(tài)分配一塊內(nèi)存空間。使用形式為:運(yùn)算符用于動(dòng)態(tài)分配一塊內(nèi)存空間。使用形式為: 指針變量指針變量 = new 長(zhǎng)度長(zhǎng)度例如分配一個(gè)可以容納例如分配一個(gè)可以容納256個(gè)個(gè)char型數(shù)據(jù)的空間型數(shù)據(jù)的空間: char *Cbuffer = new char 256 ; 使用使用new運(yùn)算符時(shí),需要注意:運(yùn)算符時(shí),需要注意:(1) 如果分配的空間長(zhǎng)度為如果分配的空間長(zhǎng)度為1個(gè)單位,則可以省略個(gè)單位,則可以省略 和其中的整和其中的整數(shù),例如:數(shù),例如: float *pNum=new float ;與與 float *pNum=new flo
32、at1;等價(jià)。等價(jià)。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)(2) 使用使用new運(yùn)算符分配內(nèi)存空間時(shí),其空間長(zhǎng)度可以是變量,運(yùn)算符分配內(nèi)存空間時(shí),其空間長(zhǎng)度可以是變量, 也可以是數(shù)值表達(dá)式,例如分配一個(gè)可以容納也可以是數(shù)值表達(dá)式,例如分配一個(gè)可以容納10個(gè)個(gè)int型數(shù)型數(shù) 據(jù)據(jù)的空間:的空間:int nSize = 5 ;int *nPInt = new intnSize+5;(3) 由由new分配的分配的內(nèi)存空間是連續(xù)的內(nèi)存空間是連續(xù)的,可以通過(guò)指針的變化訪問(wèn),可以通過(guò)指針的變化訪問(wèn) 所分配空間的每一個(gè)元素,例如:所分配空間的每一個(gè)元素,例如:int *nPInt = new int10;n
33、PInt5=100; 或或 *(nPInt+5)=100;(4) 如果當(dāng)前存儲(chǔ)器無(wú)足夠的內(nèi)存空間可分配,則如果當(dāng)前存儲(chǔ)器無(wú)足夠的內(nèi)存空間可分配,則new運(yùn)算符返運(yùn)算符返 回回0 ( NULL )。第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 由由new運(yùn)算符分配的內(nèi)存空間在使用完畢后應(yīng)該使用運(yùn)算符分配的內(nèi)存空間在使用完畢后應(yīng)該使用delete運(yùn)算符釋放。運(yùn)算符釋放。delete運(yùn)算符的使用有兩種形式運(yùn)算符的使用有兩種形式: delete指針指針 或或delete 指針指針例如:例如:int *pInt = new int ; delete pInt ; int *pManyInt=new int10
34、 ; delete pManyInt ; 使用使用delete運(yùn)算符時(shí),需要注意:運(yùn)算符時(shí),需要注意:(1)用用new運(yùn)算符獲得的內(nèi)存空間,只許使用運(yùn)算符獲得的內(nèi)存空間,只許使用一次一次delete,不允許不允許多次對(duì)同一塊空間進(jìn)行多次釋放多次對(duì)同一塊空間進(jìn)行多次釋放,否則將會(huì)產(chǎn)生嚴(yán)重錯(cuò)誤。,否則將會(huì)產(chǎn)生嚴(yán)重錯(cuò)誤。(2) delete只能用來(lái)釋放由只能用來(lái)釋放由new運(yùn)算符分配的動(dòng)態(tài)內(nèi)存空間,運(yùn)算符分配的動(dòng)態(tài)內(nèi)存空間,不得不得使用使用delete運(yùn)算符去釋放程序中的變量、數(shù)組的存儲(chǔ)空間運(yùn)算符去釋放程序中的變量、數(shù)組的存儲(chǔ)空間。5.2.2 delete運(yùn)算符運(yùn)算符第五章第五章 C+程序的結(jié)構(gòu)程序
35、的結(jié)構(gòu)1鏈表概述鏈表概述鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它的特點(diǎn)是用一組任意的存鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它的特點(diǎn)是用一組任意的存儲(chǔ)單元儲(chǔ)單元 ( 可以是連續(xù)的,也可以是不連續(xù)的可以是連續(xù)的,也可以是不連續(xù)的 ) 存放數(shù)據(jù)元素。存放數(shù)據(jù)元素。一個(gè)簡(jiǎn)單的鏈表具有下一個(gè)簡(jiǎn)單的鏈表具有下圖圖所示的結(jié)構(gòu)形式。所示的結(jié)構(gòu)形式。5.2.3 動(dòng)態(tài)內(nèi)存分配的應(yīng)用實(shí)例動(dòng)態(tài)內(nèi)存分配的應(yīng)用實(shí)例a1an頭指針heada2a3定義單鏈表結(jié)構(gòu)的最簡(jiǎn)單形式為定義單鏈表結(jié)構(gòu)的最簡(jiǎn)單形式為: struct Node int data; Node *next; ;第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 定義一個(gè)鏈表類(lèi)定義一個(gè)鏈表類(lèi)List
36、,其中包含鏈表結(jié)點(diǎn)的,其中包含鏈表結(jié)點(diǎn)的插入、刪除、插入、刪除、訪問(wèn)訪問(wèn)等功能的成員函數(shù),以便對(duì)鏈表進(jìn)行操作。等功能的成員函數(shù),以便對(duì)鏈表進(jìn)行操作。class List Node *head; /聲明一個(gè)鏈表結(jié)構(gòu)聲明一個(gè)鏈表結(jié)構(gòu)指針指針 public: List( ) head = NULL ; void InsertList ( int aData , int bData ) ;/鏈表結(jié)點(diǎn)的鏈表結(jié)點(diǎn)的插入插入 void DeleteList ( int aData ) ; /鏈表結(jié)點(diǎn)的鏈表結(jié)點(diǎn)的刪除刪除 void OutputList ( ) ; /鏈表結(jié)點(diǎn)的鏈表結(jié)點(diǎn)的訪問(wèn)訪問(wèn) Node *
37、Gethead( ) return head ; ;第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)void List:OutputList( )/鏈表結(jié)點(diǎn)的鏈表結(jié)點(diǎn)的訪問(wèn)訪問(wèn) Node *current = head ;/建立鏈表頭指針建立鏈表頭指針 while ( current != NULL )/如果鏈表存在,如果鏈表存在, coutdatanext ;/指向下一個(gè)結(jié)點(diǎn)指向下一個(gè)結(jié)點(diǎn) coutdata = bData ;/將將新結(jié)點(diǎn)新結(jié)點(diǎn)b的數(shù)據(jù)放入的數(shù)據(jù)放入新存儲(chǔ)區(qū)新存儲(chǔ)區(qū)p = head ;/結(jié)點(diǎn)指針結(jié)點(diǎn)指針p指向鏈表頭指向鏈表頭 if ( head = NULL )/若是空表,若是空表,
38、head = s ;/將新存儲(chǔ)區(qū)的地址賦給表頭,即使將新存儲(chǔ)區(qū)的地址賦給表頭,即使 s-next = NULL ;/新結(jié)點(diǎn)新結(jié)點(diǎn)b作為第一個(gè)結(jié)點(diǎn)作為第一個(gè)結(jié)點(diǎn) else/若不是空表若不是空表 if( p-data = aData ) /若若a是第一個(gè)結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn) head = s;/使使新結(jié)點(diǎn)新結(jié)點(diǎn)b作為第一個(gè)結(jié)點(diǎn)作為第一個(gè)結(jié)點(diǎn) s-next = p;/將結(jié)點(diǎn)將結(jié)點(diǎn)a接到接到新結(jié)點(diǎn)新結(jié)點(diǎn)b的后面的后面 第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) else /若若a不是第一個(gè)結(jié)點(diǎn)不是第一個(gè)結(jié)點(diǎn) while( p-data != aData & p-next != NULL) /找結(jié)點(diǎn)找結(jié)
39、點(diǎn)a q = p ;/使使q指向指向p所指的結(jié)點(diǎn)所指的結(jié)點(diǎn) p = p-next ;/ p本身指向下一個(gè)結(jié)點(diǎn)本身指向下一個(gè)結(jié)點(diǎn)if( p-data = aData )/若有結(jié)點(diǎn)若有結(jié)點(diǎn)a,則,則q指向的是指向的是ak q-next = s ;/將將新結(jié)點(diǎn)新結(jié)點(diǎn)b插入結(jié)點(diǎn)插入結(jié)點(diǎn)ak之后之后 s-next = p ;/將結(jié)點(diǎn)將結(jié)點(diǎn)a排在排在新結(jié)點(diǎn)新結(jié)點(diǎn)b之后之后 else/若沒(méi)有結(jié)點(diǎn)若沒(méi)有結(jié)點(diǎn)a p-next = s ;/將將新結(jié)點(diǎn)新結(jié)點(diǎn)b排在鏈表末尾,即排在鏈表末尾,即 s-next = NULL ;/將將新存儲(chǔ)區(qū)新存儲(chǔ)區(qū)排在鏈表末尾。排在鏈表末尾。 第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu) 要
40、在鏈表中刪除結(jié)點(diǎn)要在鏈表中刪除結(jié)點(diǎn)a,并釋放被刪除的結(jié)點(diǎn)所占的存儲(chǔ)空,并釋放被刪除的結(jié)點(diǎn)所占的存儲(chǔ)空間,需要考慮下列幾種情況間,需要考慮下列幾種情況:(1) 若要?jiǎng)h除的結(jié)點(diǎn)若要?jiǎng)h除的結(jié)點(diǎn)a是第一個(gè)結(jié)點(diǎn),則把是第一個(gè)結(jié)點(diǎn),則把head指向指向a的下一個(gè)的下一個(gè)結(jié)點(diǎn),如圖結(jié)點(diǎn),如圖 (a)所示。所示。(2) 若要?jiǎng)h除的結(jié)點(diǎn)若要?jiǎng)h除的結(jié)點(diǎn)a不是第一個(gè)結(jié)點(diǎn),則應(yīng)使不是第一個(gè)結(jié)點(diǎn),則應(yīng)使a的上一結(jié)點(diǎn)的上一結(jié)點(diǎn)ak-1的指針域指向的指針域指向a的下一個(gè)結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)ak+1,如圖,如圖 (b)所示。所示。(3) 若空表或要?jiǎng)h除的結(jié)點(diǎn)若空表或要?jiǎng)h除的結(jié)點(diǎn)a不存在,則不作任何改變。不存在,則不作任何改變。4
41、鏈表結(jié)點(diǎn)的刪除鏈表結(jié)點(diǎn)的刪除a1headaak-1akak+1(a)(b)第五章第五章 C+程序的結(jié)構(gòu)程序的結(jié)構(gòu)/設(shè)設(shè)aData是要被刪除結(jié)點(diǎn)是要被刪除結(jié)點(diǎn)a中的數(shù)據(jù)成員中的數(shù)據(jù)成員void List:DeleteList ( int aData ) Node *p , *q ; p = head ; if ( p = NULL ) return ; /若若p為空,則返回為空,則返回 if ( p-data = aData ) /若若a是第一個(gè)結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn) head = p-next;/鏈表頭指向下一個(gè)結(jié)點(diǎn)鏈表頭指向下一個(gè)結(jié)點(diǎn) delete p ;/刪除結(jié)點(diǎn)刪除結(jié)點(diǎn)a else/若若a不是第一個(gè)結(jié)點(diǎn)不是第一個(gè)結(jié)點(diǎn) 第五章第五章 C+程序的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 維修勞務(wù)合同模板(2篇)
- 南京航空航天大學(xué)《編譯原理》2021-2022學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《市場(chǎng)營(yíng)銷(xiāo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 房建施工組織設(shè)計(jì)
- 某市中心諾蘭攝影工作室工程項(xiàng)目施工組織設(shè)計(jì)
- 壓濾車(chē)間施工組織設(shè)計(jì)
- 《小星星》說(shuō)課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《給排水工程制圖與CAD》2023-2024學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)《自動(dòng)控制原理》2021-2022學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)《藥物新劑型與新技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 金融服務(wù)營(yíng)銷(xiāo)報(bào)告總結(jié)
- 35kv集電線路監(jiān)理標(biāo)準(zhǔn)細(xì)則
- 橋式起重機(jī)定期檢查記錄表
- T∕CACM 1090-2018 中醫(yī)治未病技術(shù)操作規(guī)范 穴位敷貼
- 2024版人教版英語(yǔ)初一上單詞默寫(xiě)單
- 化學(xué)實(shí)驗(yàn)室安全智慧樹(shù)知到期末考試答案2024年
- 經(jīng)典房地產(chǎn)營(yíng)銷(xiāo)策劃培訓(xùn)(全)
- 工人入場(chǎng)安全教育課件
- 【川教版】《生命 生態(tài) 安全》二年級(jí)上冊(cè)第12課 少點(diǎn)兒馬虎 多點(diǎn)兒收獲 課件
- 人教版數(shù)學(xué)四年級(jí)上冊(cè)第五單元 《平行四邊形和梯形》 大單元作業(yè)設(shè)計(jì)
- 靜配中心差錯(cuò)預(yù)防
評(píng)論
0/150
提交評(píng)論