大學(xué)C老師親自總結(jié)要點(diǎn)_第1頁
大學(xué)C老師親自總結(jié)要點(diǎn)_第2頁
大學(xué)C老師親自總結(jié)要點(diǎn)_第3頁
大學(xué)C老師親自總結(jié)要點(diǎn)_第4頁
大學(xué)C老師親自總結(jié)要點(diǎn)_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

大學(xué)C老師親自總結(jié)要點(diǎn)大學(xué)C老師親自總結(jié)要點(diǎn)大學(xué)C老師親自總結(jié)要點(diǎn)1數(shù)組一維數(shù)組的定義一般語法形式數(shù)據(jù)類型數(shù)組名[常量表達(dá)式]例:inta[10]floats[5]一維數(shù)組初始化在定義一個(gè)數(shù)組的同時(shí)對數(shù)組元素賦初值例:inta[5]={1,2,3,4,5},b;可以僅對一部分下標(biāo)元素賦初值例:inta[5]={1,2,3};對數(shù)組中全部元素賦初值為0例:inta[5]={0};如果對數(shù)組的元素全部賦初值,可以省略定義元素個(gè)數(shù)例:inta[]={1,2,3,4,5,6};二維數(shù)組二維數(shù)組的定義一般語法形式數(shù)據(jù)類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]例:inta[3][5];floats[6][3];二維數(shù)組初始化在定義一個(gè)數(shù)組的同時(shí)對數(shù)組元素賦初值例:inta[2][5]={{1,2,3,4,5},{4,5,6,7,8}};將各元素的初值寫在一個(gè)大括號里例:inta[2][5]={1,2,3,4,5,6,7,8,9,0};可以僅對一部分下標(biāo)元素賦初值例:inta[2][5]={{1,2},{3,4,5}};例:inta[2][5]={1,2,3,4,5,6};對數(shù)組中全部元素賦初值為0例:inta[2][5]={0};2字符數(shù)組和字符串字符數(shù)組的定義在C++的基本數(shù)據(jù)類型變量中沒有字符串變量,采用字符型數(shù)組來存放字符串。字符型數(shù)組定義的一般語法形式為:

char數(shù)組名[常量表達(dá)式]例:charc[10];chars[20];字符數(shù)組的初始化字符數(shù)組引用方法及其他類型的數(shù)組基本相同。例:chara[20]={'T','h','i','s','','i','s','','a','','b','o','o','k'}; charb[10]="program"; inti; cout<<a<<endl; for(i=1;i<=20;i++) cout<<a[i]; cout<<endl; cout<<b<<endl;指針3指針變量的聲明一般語法格式數(shù)據(jù)類型*指針變量名;其中:數(shù)據(jù)類型----可以是任意類型,指的是指針?biāo)赶虻膶ο蟮臄?shù)據(jù)類型。這說明了指針?biāo)傅膬?nèi)存單元可以有用于存放什么類型的數(shù)據(jù),稱之為指針的類型。例:int*p;//指針p用來存放int型數(shù)據(jù)的地址

float*a;//指針p用來存放float型數(shù)據(jù)的地址“*”和“&”*稱為指針運(yùn)算符,表示指針?biāo)赶虻淖兞康闹?*出現(xiàn)在聲明語句中的被聲明變量之前時(shí),表示被聲明的變量是指針變量。如:int*p; *出現(xiàn)在執(zhí)行語句中或聲明語句的初值表達(dá)式中時(shí),表示訪問指針?biāo)笇ο蟮膬?nèi)容。如:cout<<*p;&取地址運(yùn)算符,用來得到一個(gè)對象的地址

&出現(xiàn)在聲明語句中的被聲明變量之前時(shí),表示聲明的引用。如:int&x; &出現(xiàn)在執(zhí)行語句中或聲明語句的初值表達(dá)式中時(shí),表示取對象的地址。 如:inta;int*p;a=1;p=&a;

cout<<"a="<<a<<"p="<<p<<endl;4指針運(yùn)算指針是一種數(shù)據(jù)類型,及其他數(shù)據(jù)類型一樣,指針變量也可以參及部分運(yùn)算,主要是算術(shù)運(yùn)算、關(guān)系運(yùn)算和賦值運(yùn)算,只是運(yùn)算規(guī)則比較特殊。指針變量的算術(shù)運(yùn)算主要是加減運(yùn)算,指針加減運(yùn)算的結(jié)果及指針的數(shù)據(jù)類型密切相關(guān)。如:指針變量的引用例:#include<iostream>usingnamespacestd;voidmain(){

inta,b,*p1,*p2;

p1=&a; p2=&b; *p1=123; *p2=456; cout<<"a="<<a<<endl; cout<<"p1="<<p1<<endl; cout<<"b="<<b<<endl; cout<<"p2="<<p2<<endl;}5指針及數(shù)組

#include<iostream>usingnamespacestd;

voidmain(){

inta[8],*p;

p=&a[0];

*p=123;

p++; *p=456;

cout<<"a[0]="<<a[0]<<endl; cout<<"a[1]="<<a[1]<<endl;}指針及多維數(shù)組#include<iostream>usingnamespacestd;voidmain(){ inta[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j,*p; for(i=0;i<3;i++) { for(j=0;j<3;j++) { p=&a[0][0]+i*3+j; cout<<*p<<""; } cout<<endl;}}指針及多維數(shù)組#include<iostream>usingnamespacestd;

voidmain(){ inta[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j,*p; for(i=0;i<3;i++) { for(j=0;j<3;j++) { p=a[i]+j; cout<<*p<<""; } cout<<endl; }}6指針及字符串#include<iostream>usingnamespacestd;

voidmain(){

chara[15]="abcdefg",i,*p; p=&a[0];

for(i=0;i<15;i++) { if(*p==0) break; cout<<*p; p++; } cout<<endl;}7動態(tài)存儲分配一般語法形式new數(shù)據(jù)類型[整型表達(dá)式1][整型表達(dá)式2]……;其中:數(shù)據(jù)類型表示要申請何種數(shù)據(jù)類型的存儲空間整型表達(dá)式表示每一維數(shù)組的長度功能:動態(tài)為一維或多維數(shù)組申請存儲空間如果申請分配成功,返回?cái)?shù)組的指針,失敗則返回空指針null。8釋放動態(tài)分配存儲空間一般語法形式delete[]指針;功能:用于釋放動態(tài)申請的數(shù)組存儲空間#include<iostream>usingnamespacestd;

voidmain(){

int*a,i,n;

cout<<"請輸入1班同學(xué)的人數(shù):"; cin>>n;

a=newint[n];

for(i=0;i<n;i++) { cout<<"請輸入1班"<<i+1<<"號同學(xué)的成績:"; cin>>a[i];}

cout<<endl; for(i=0;i<n;i++) { cout<<"1班"<<i+1<<"號同學(xué)的成績是:"; cout<<a[i]<<endl;} cout<<endl;delete[]a;}自定義數(shù)據(jù)類型9結(jié)構(gòu)體結(jié)構(gòu)體是由不同數(shù)據(jù)類型的數(shù)據(jù)組成的集合體結(jié)構(gòu)體聲明語句的語法形式:struct結(jié)構(gòu)名{

數(shù)據(jù)類型說明符1成員名1; 數(shù)據(jù)類型說明符2成員名2;

︰︰

數(shù)據(jù)類型說明符n成員名n;};結(jié)構(gòu)體類型變量聲明的語法形式:結(jié)構(gòu)名結(jié)構(gòu)變量名;結(jié)構(gòu)成員的引用形式:結(jié)構(gòu)變量名.成員名例:#include<iostream>usingnamespacestd;structstudent{ intnum; charname[20]; intage;};voidmain(){

studentstu1={1,"zhangsan",18},stu2; stu2.num=2; stu2.age=20; cout<<stu1.num<<""<<<<endl; cout<<stu2.num<<""<<stu2.age<<endl;}#include<iostream>usingnamespacestd;

structstudent{ intnum; charname[20]; intage;};voidmain(){

studentstu[5]={1,"zhangsan",18}; stu[1].num=2; stu[1].age=20;

cout<<stu[0].num<<""<<stu[0].name<<endl; cout<<stu[1].num<<""<<stu[1].age<<endl;}10結(jié)構(gòu)體數(shù)組11函數(shù)計(jì)算機(jī)技術(shù)基礎(chǔ)系列課程課件函數(shù)的定義函數(shù)定義的語法形式類型標(biāo)識符函數(shù)名(形式參數(shù)表){

語句序列}函數(shù)的類型和返回值函數(shù)的類型----類型標(biāo)識符規(guī)定了函數(shù)的類型,也就是函數(shù)的返回值的數(shù)據(jù)類型函數(shù)的返回值----是指需要返回給主調(diào)函數(shù)的處理結(jié)果,由return語句給出。如:return0;returny;等無返回值的函數(shù)其類型標(biāo)識符為void,不必寫return語句形式參數(shù)形式參數(shù)(簡稱形參)表的內(nèi)容如下:type1name1,type2name2,……,typennamen例如:intx,inty,floatz,……形參的作用:實(shí)現(xiàn)主調(diào)函數(shù)及被調(diào)函數(shù)之間的數(shù)據(jù)聯(lián)系。沒有形參的函數(shù)在形參表的位置應(yīng)寫void函數(shù)在被調(diào)用前是靜止的,被調(diào)用時(shí)才由主調(diào)函數(shù)將實(shí)際參數(shù)(簡稱實(shí)參)賦予形參,并執(zhí)行該函數(shù)過程函數(shù)的調(diào)用函數(shù)調(diào)用的語法形式

函數(shù)名(實(shí)參列表)實(shí)參列表中應(yīng)給出及函數(shù)形參個(gè)數(shù)相同、類型相符的實(shí)參(實(shí)參可以是:常量、變量和表達(dá)式)例如:(3,x,5*a+b,……)函數(shù)調(diào)用可以作為語句,這時(shí)函數(shù)可以沒有返回值函數(shù)調(diào)用的執(zhí)行過程main()調(diào)

fun(a,2*b)結(jié)束保存返回地址進(jìn)行參數(shù)傳遞恢復(fù)返回地址帶回計(jì)算結(jié)果

fun(intx,floaty)返回12函數(shù)的原型聲明調(diào)用函數(shù)之前先要在主調(diào)函數(shù)中聲明函數(shù)原型語法形式:類型標(biāo)識符函數(shù)名(形式參數(shù)表);注意:在函數(shù)調(diào)用之前對所調(diào)用的函數(shù)進(jìn)行聲明,指出該函數(shù)的返回值的類型以及形參的個(gè)數(shù)和類型,編譯器據(jù)此信息對函數(shù)調(diào)用進(jìn)行語法檢查,保證形參和實(shí)參的個(gè)數(shù)和類型的一致性,保證返回值的使用正確性。13函數(shù)重載函數(shù)重載兩個(gè)以上的函數(shù),取相同的函數(shù)名,但是形參的個(gè)數(shù)或者類型不同,編譯器根據(jù)實(shí)參和形參的類型及個(gè)數(shù)的最佳匹配,自動確定調(diào)用哪一個(gè)函數(shù),這就是函數(shù)的重載14函數(shù)的參數(shù)傳遞值調(diào)用值調(diào)用是指當(dāng)發(fā)生函數(shù)調(diào)用時(shí),給形參分配內(nèi)存空間,并用實(shí)參來初始化形參(直接將實(shí)參的值傳遞給形參)。這一過程是參數(shù)值的單向傳遞過程,一旦形參獲得了值便及實(shí)參脫離關(guān)系,此后無論形參發(fā)生了怎樣的改變,都不會影響到實(shí)參引用調(diào)用引用調(diào)用可以使在子函數(shù)中對形參所做的更改對主函數(shù)中的實(shí)參有效。值調(diào)用#include<iostream>usingnamespacestd;intabc(inta){ a=a*10; cout<<"a="<<a<<endl; returna;}intabc(inta);voidmain(){ inta; a=5; abc(a); cout<<"a="<<a<<endl;}引用調(diào)用#include<iostream>usingnamespacestd;intabc(int&a){ a=a*10; cout<<"a="<<a<<endl; returna;}intabc(int&a);voidmain(){ inta; a=5; abc(a); cout<<"a="<<a<<endl;}#include<iostream>usingnamespacestd;intmin(inta[],intlength){ inti,m; m=0; for(i=1;i<length;i++) if(a[i]<a[m])m=i; returnm;}voidmain(){ intarray[10]={18,26,23,13,15,25,27,14,29,31},tag;

tag=min(array,10);

cout<<"數(shù)組中最小的元素是:"<<array[tag]<<endl;}*

找出數(shù)組中的最小元素。函數(shù)的參數(shù)為數(shù)組:#include<iostream>usingnamespacestd;intmin(int*p,intlength){ inti,m; m=*p;p++; for(i=1;i<length;i++,p++) if(*p<m)m=*p; returnm;}voidmain(){ intarray[10]={18,26,23,13,15,25,27,14,29,31},t;

t=min(array,10);

cout<<"數(shù)組中最小的元素是:"<<t<<endl;}*

找出數(shù)組中的最小元素。函數(shù)的參數(shù)為指針:#include<iostream>usingnamespacestd;int*min(int*p,intlength){ inti,*p1; p1=p;p++; for(i=1;i<length;i++,p++) if(*p<*p1)p1=p; returnp1;}voidmain(){ intarray[10]={18,26,23,13,15,25,27,14,29,31},*t;

t=min(array,10);

cout<<"數(shù)組中最小的元素是:"<<*t<<endl;}*

找出數(shù)組中的最小元素。函數(shù)的返回值為指針:#include<iostream>usingnamespacestd;voidchange(int*&t){ intx=15; t=&x; cout<<"t="<<t<<endl;}voidmain(){ int*p; change(p); cout<<"p="<<p<<endl;}函數(shù)的參數(shù)為指針變量的引用:15函數(shù)的遞歸調(diào)用一個(gè)函數(shù)直接或間接地調(diào)用該函數(shù)本身,便構(gòu)成了函數(shù)的遞歸調(diào)用。前者稱為直接遞歸調(diào)用,后者稱為間接遞歸調(diào)用。什么叫遞歸調(diào)用?例:求n!#include<iostream>usingnamespacestd;intfac(intn);voidmain(){ intnf; nf=fac(6); cout<<"6!="<<nf<<endl;}intfac(intn){ if(n<=1) return1; else returnn*fac(n-1);}遞歸調(diào)用的執(zhí)行過程main()調(diào)用fac(3)返回fac(3)返回3*調(diào)用fac(2)3*2*1fac(1)返回1返回2*調(diào)用fac(1)2*1fac(2)16C++系統(tǒng)函數(shù)為了方便程序員編程,VisualC++軟件包提供了大量已預(yù)先編制好的函數(shù),即系統(tǒng)函數(shù)(又稱庫函數(shù)或標(biāo)準(zhǔn)函數(shù)),對于系統(tǒng)函數(shù),用戶可以不用定義和聲明而直接調(diào)用它們。C++軟件包將不同功能的系統(tǒng)函數(shù)的函數(shù)原型分別寫在不同的頭文件中,這些頭文件是以“.h”為文件名后綴的文件,在使用某一系統(tǒng)函數(shù)前,必須用include預(yù)處理指令給出該函數(shù)的原型所在頭文件的文件名。例:函數(shù)名:sqrt函數(shù)原型:doublesqrt(doublex);所需頭文件:<math.h>功能和返回值:計(jì)算并返回x的平方根。

17內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)不是在調(diào)用時(shí)發(fā)生控制轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每一個(gè)調(diào)用語句處定義內(nèi)聯(lián)函數(shù)的語法形式inline類型說明符被調(diào)函數(shù)名(含類型說明符的形參表)注意:內(nèi)聯(lián)函數(shù)體內(nèi)一般不能有循環(huán)語句和switch語句內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在第一次被調(diào)用之前通常內(nèi)聯(lián)函數(shù)應(yīng)該是比較簡單的函數(shù),結(jié)果簡單、語句少如果將一個(gè)復(fù)雜的函數(shù)定義為內(nèi)聯(lián)函數(shù),會造成代碼膨脹,增大開銷#include<iostream>usingnamespacestd;

voidmain(){ doublex,y,z; cout<<"enterx:"; cin>>x>>y;z=cube(x)-cube(y); cout<<"z="<<z<<endl;}inlinedoublecube(doublex){ returnx*x*x;}例:計(jì)算類和對象4618類的定義在C++中聲明類的一般形式為:class<類名>{

數(shù)據(jù)成員聲明;

成員函數(shù)聲明; …………;

};<各個(gè)成員函數(shù)的實(shí)現(xiàn)>;變量聲明函數(shù)原型聲明

類的定義包含兩部分:類頭和類體,類頭由關(guān)鍵字class及其后面的類名構(gòu)成;類體由一對大括號包圍起來,一般情況下,類定義后面接一個(gè)分號。

別忘了必須用分號結(jié)束!4719關(guān)于訪問權(quán)限類成員訪問權(quán)限公有(public)成員:可以在類外訪問。私有(private)成員:只能被該類的成員函數(shù)訪問。保護(hù)(protected)成員:只能被該類的成員函數(shù)或派生類的成員函數(shù)訪問。數(shù)據(jù)成員通常是私有的。成員函數(shù)通常有一部分是公有的,一部分是私有的。公有成員函數(shù)可在類外被訪問,也稱之為類的接口。48類的定義class<類名>{

private:<私有數(shù)據(jù)成員和成員函數(shù)>;

protected:<保護(hù)數(shù)據(jù)成員和成員函數(shù)>;

public:<公有數(shù)據(jù)成員和成員函數(shù)>;};<各個(gè)成員函數(shù)的實(shí)現(xiàn)>;成員函數(shù)的實(shí)現(xiàn)方法既可以定義在類的內(nèi)部也可以定義在類的外部!49類的數(shù)據(jù)成員數(shù)據(jù)成員的聲明和定義類的數(shù)據(jù)成員的聲明方式同變量聲明相同,數(shù)據(jù)成員可以是任意類型,包括基本數(shù)據(jù)類型,例如整型、字符,也可以包括復(fù)雜類型,例如結(jié)構(gòu)、結(jié)構(gòu)數(shù)組和類類型。數(shù)據(jù)成員聲明的一般形式:

類型名對象名;例如:

intx;缺省了訪問權(quán)限定義,數(shù)據(jù)成員整型變量x為私有數(shù)據(jù)成員5020類的成員函數(shù)成員函數(shù)的聲明和定義函數(shù)的原型聲明要寫在類的主體中,原型說明了函數(shù)的形參表和返回值類型。而函數(shù)的具體定義是寫在類定義之外的。及普通函數(shù)不同的是,定義函數(shù)時(shí)要指明類的具體名稱。成員函數(shù)定義的一般形式:函數(shù)類型類名::成員函數(shù)名([形參表]){

函數(shù)體}5121對象聲明了數(shù)據(jù)類型“類”之后,就可以像定義int、float等數(shù)據(jù)類型變量那樣去建立類的變量。只是將“類”類型的變量叫類對象,或類實(shí)例(實(shí)體)。這個(gè)所謂的“對象”是指將一組和使用該數(shù)據(jù)的一組操作或過程封裝起來,形成獨(dú)立的實(shí)體。這樣必須定義實(shí)體的變量。對類來說就是為該類定義一個(gè)對象。52定義類對象稱為類的實(shí)例化類對象定義的一般形式:

1、類名類對象名;

例如:Pointa;

2、類名類對象指針名;

例如:Point*p;

注意:p=newPoint;動態(tài)創(chuàng)建一個(gè)對象

p=&a;獲取已定義對象的地址

deletep;動態(tài)創(chuàng)建的對象可在不需要時(shí)釋放5322對象成員的引用數(shù)據(jù)成員對象名.成員名

或:對象指針名->成員名例:a.xa.y或p->xp->y成員函數(shù)對象名.

成員名(參數(shù)表)或:對象指針名->成員名(參數(shù)表)例:a.setPoint(10,10)a.move(5,3)a.display()

p->setPoint(5,6)p->move(2,5)p->display()54構(gòu)造函數(shù)和析構(gòu)函數(shù)

5523構(gòu)造函數(shù)

構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類的成員函數(shù),但是他們是特殊的成員函數(shù),不用調(diào)用便自動執(zhí)行,而且這些函數(shù)的名字及類的名字有關(guān).問題提出:類的數(shù)據(jù)成員如何初始化?

類定義體中不能在定義時(shí)初始化數(shù)據(jù)成員,數(shù)據(jù)成員的值是無定義的。C++提供了一個(gè)方法:利用類的構(gòu)造函數(shù)來初始化類的數(shù)據(jù)成員.56構(gòu)造函數(shù)構(gòu)造函數(shù)是類的一個(gè)特殊成員函數(shù)它及類同名沒有返回值(甚至連關(guān)鍵字void也不能有)在創(chuàng)建類的對象時(shí),編譯器會自動調(diào)用類的“構(gòu)造函數(shù)”可以在構(gòu)造函數(shù)中執(zhí)行初始化成員變量的操作。57構(gòu)造函數(shù)的形式參數(shù)Point(){x=0;y=0;}//定義無參構(gòu)造函數(shù)對應(yīng)的類對象聲明:Pointa;Point(intx1,inty1){x=x1;y=y1;}

//定義有參構(gòu)造函數(shù)對應(yīng)的類對象聲明:Pointa(0,0);

或:

Pointa(3,5);58構(gòu)造函數(shù)的形式參數(shù)Point(intx1=0,inty1=0){x=x1;y=y1;}

//定義帶默認(rèn)值的有參構(gòu)造函數(shù)對應(yīng)的類對象聲明:Pointa();

或:

Pointa(3,5);

或:

Pointa(6);59

重載構(gòu)造函數(shù)

構(gòu)造函數(shù)可以象普通函數(shù)一樣被重載,C++根據(jù)說明中的參數(shù)個(gè)數(shù)和類型選擇合適的構(gòu)造函數(shù).

例:在Point類中重載構(gòu)造函數(shù)

Point(){x=0;y=0;}//定義構(gòu)造函數(shù)

Point(intx1,inty1){x=x1;y=y1;}//有參構(gòu)造函數(shù)60默認(rèn)構(gòu)造函數(shù)

如果一個(gè)類沒有定義構(gòu)造函數(shù),編譯器會自動生成一個(gè)不帶參數(shù)的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù),在程序中定義一個(gè)對象而沒有指明初始化時(shí),編譯器便按默認(rèn)構(gòu)造函數(shù)來初始化該對象。classPoint{public:

Point(){} ...}61

對象指針Firstpoint:(12,6)Secondpoint:(5,12)void

main(){ Pointa(12,6),*p=newPoint(5,12); cout<<“Firstpoint:”; a.dispoint(); cout<<“Sencondpoint:”; p->dispoint();

deletep;}

執(zhí)行結(jié)果如下:注意:在動態(tài)創(chuàng)建對象時(shí),要調(diào)用類的構(gòu)造函數(shù)。6224拷貝(初始化)構(gòu)造函數(shù)概念:拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)的形參為本類對象的引用。作用:當(dāng)使用同類型的對象初始化另一個(gè)對象時(shí),不能簡單的將一個(gè)對象的數(shù)據(jù)成員直接拷貝給另一個(gè)對象。為了達(dá)到對象整體復(fù)制的目的,需要定義一個(gè)特殊的構(gòu)造函數(shù):拷貝構(gòu)造函數(shù)。63拷貝構(gòu)造函數(shù)聲明形式為:class類名{public:

類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//拷貝構(gòu)造函數(shù)

...};類名::類名(類名&對象名)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){函數(shù)體}64需要注意:拷貝構(gòu)造函數(shù)是將已知對象的數(shù)據(jù)成員的值拷貝給正在創(chuàng)建的同類的對象拷貝構(gòu)造函數(shù)只能有一個(gè)參數(shù),并且是對某個(gè)對象的引用每個(gè)類必須有一個(gè)拷貝初始化構(gòu)造函數(shù),若沒有顯式說明,則系統(tǒng)會自動生成一個(gè)默認(rèn)的拷貝初始化構(gòu)造函數(shù)6525析構(gòu)函數(shù)的引出問題的提出:對象消失時(shí)應(yīng)做一些掃尾工作?一個(gè)類的對象在生命期間分配了資源,這些資源需要在對象不復(fù)存在以前被釋放.(例如,如果構(gòu)造函數(shù)中動態(tài)分配了內(nèi)存,這塊內(nèi)存在對象消失之前必須被釋放.)

及構(gòu)造函數(shù)對應(yīng)的是析構(gòu)函數(shù),當(dāng)一個(gè)對象消失時(shí),系統(tǒng)會自動調(diào)用類的析構(gòu)函數(shù)。66析構(gòu)函數(shù)析構(gòu)函數(shù)名字:符號“~”+類名析構(gòu)函數(shù)沒有參數(shù)沒有返回值.一個(gè)類中只可能定義一個(gè)析構(gòu)函數(shù),所以析構(gòu)函數(shù)不能重載。析構(gòu)函數(shù)在對象生命期結(jié)束時(shí)被編譯器自動調(diào)用。67析構(gòu)函數(shù)聲明形式為:class類名{public:

類名(形參);//構(gòu)造函數(shù)

~類名();//析構(gòu)函數(shù)

...};類名::~類名()//析構(gòu)函數(shù)的實(shí)現(xiàn){函數(shù)體}68默認(rèn)析構(gòu)函數(shù)

如同默認(rèn)構(gòu)造函數(shù)一樣,如果一個(gè)類沒有定義析構(gòu)函數(shù),編譯器會自動生成一個(gè)默認(rèn)析構(gòu)函數(shù),其格式如下:

<類名>::~<默認(rèn)析構(gòu)函數(shù)名>(){}默認(rèn)析構(gòu)函數(shù)是一個(gè)空函數(shù)69析構(gòu)函數(shù)的自動調(diào)用

當(dāng)對象超出其定義范圍時(shí)(即釋放該對象時(shí)),編譯器自動調(diào)用析構(gòu)函數(shù)。在以下情況下,析構(gòu)函數(shù)也會被自動調(diào)用。如果一個(gè)對象被定義在一個(gè)函數(shù)體內(nèi),則當(dāng)這個(gè)函數(shù)結(jié)束時(shí),該對象的析構(gòu)函數(shù)被自動調(diào)用若一個(gè)對象是使用new運(yùn)算符動態(tài)創(chuàng)建的,在使用delete運(yùn)算符釋放它時(shí),delete將會自動調(diào)用析構(gòu)函數(shù)70構(gòu)造函數(shù)及析構(gòu)函數(shù)

構(gòu)造函數(shù)和析構(gòu)函數(shù)是兩個(gè)非常特殊的函數(shù):它們都沒有返回值。

對于構(gòu)造函數(shù)和析構(gòu)函數(shù)而言,我們在定義的時(shí)候應(yīng)該把它們定義成public類型的,因?yàn)檫@兩個(gè)函數(shù)也要遵循類的成員函數(shù)的訪問限制,雖然我們沒有顯式的調(diào)用它們。

構(gòu)造函數(shù)和析構(gòu)函數(shù)不能顯式的被調(diào)用。7126數(shù)據(jù)成員的初始化72數(shù)據(jù)成員的初始化1.在構(gòu)造函數(shù)的函數(shù)體中進(jìn)行初始化。2.在構(gòu)造函數(shù)的頭部初始化。3.混合初始化。4.拷貝構(gòu)造函數(shù)73在構(gòu)造函數(shù)的函數(shù)體中初始化classPerson{ charm_strName[20];intm_nAge;intm_nSex;public: Person(){strcpy(m_strName,”XXX”);m_nAge=0;m_nSex=0;} Person(char*name,intage,charsex) { strcpy(m_strName,name);m_nAge=age;m_nSex=(sex=='m'?0:1); }}例如,當(dāng)遇到聲明

Personpersonl(“Zhang3”,19,‘f’); Personperson2=Person(“Zhang3”,19,‘f’);74

在構(gòu)造函數(shù)的頭部初始化。其格式為:

<類名>::<構(gòu)造函數(shù)>(<參數(shù)表>):<變量1>(<初值1>),…,<變量n>(<初值n>)

{

…… }例如Person::Person():m_nAge(0),m_nSex(0) { }75混合初始化例如Person::Person():m_nAge(0),m_nSex(0) { strcpy(m_strName,“XXX”); }76類的繼承7727類的繼承

繼承機(jī)制使類及類之間建立一種上下級的層次關(guān)系,通過繼承,從現(xiàn)有類中獲得其屬性和行為,并對其覆蓋、改寫、新增,產(chǎn)生新類所需要的功能。創(chuàng)建新類時(shí),無須從頭編寫數(shù)據(jù)成員和成員函數(shù),只需要選擇合適的基類,派生類可以增加自己的數(shù)據(jù)成員和成員函數(shù),因此派生類比基類更強(qiáng)大,繼承真正的優(yōu)越性來自于可以在派生類中對基類特征的追加、替代和精簡。78基本概念繼承及派生繼承----從現(xiàn)有類中繼承其屬性和行為,產(chǎn)生新類。派生----利用現(xiàn)有類的屬性和行為,派生出新類?;?、派生類從一個(gè)類派生出另一個(gè)類時(shí),原始類稱為基類(或者父類、超類),新類稱為派生類(或者子類)。7928單一繼承和多重繼承

在C++中有兩種繼承:單一繼承和多重繼承。對于單一繼承,派生類只有一個(gè)基類,對于多重繼承,派生類可以有多個(gè)基類。單一繼承A類B類多重繼承A類B類C類D類8029派生類的定義格式class派生類名:繼承方式基類名{

派生類增加的成員聲明;};

1,繼承方式基類名2,…,繼承方式基類名n81派生類的定義形式class派生類名:基類名

{

派生類成員;};繼承方式可以使用關(guān)鍵字public表示公有繼承,或者使用關(guān)鍵字private表示私有繼承,或者使用關(guān)鍵字protected表示保護(hù)繼承,最常見的是公有繼承。繼承方式82派生類的語法結(jié)構(gòu)class<派生類名>:<繼承方式><基類名>{

private: 新增私有數(shù)據(jù)成員和成員函數(shù)

protected: 新增保護(hù)數(shù)據(jù)成員和成員函效

public: 新增公有數(shù)據(jù)成員和成員函效}8330派生類的繼承方式私有繼承private公有繼承public

保護(hù)繼承protected84公有繼承(public)

公有繼承方式創(chuàng)建的派生類對基類各種成員訪問權(quán)限如下:基類公有成員相當(dāng)于派生類的公有成員,即派生類可以象訪問自身公有成員一樣訪問從基類繼承的公有成員?;惐Wo(hù)成員相當(dāng)于派生類的保護(hù)成員,即派生類可以象訪問自身的保護(hù)成員一樣,訪問基類的保護(hù)成員。對于基類的私有成員,派生類內(nèi)部成員無法直接訪問。派生類使用者也無法通過派生類對象直接訪問。85私有繼承

(private)派生類對基類各種成員訪問權(quán)限如下:基類公有成員和保護(hù)成員都相當(dāng)于派生類的私有成員,派生類只能通過自身的函數(shù)成員訪問他們對于基類的私有成員,無論派生類內(nèi)部成員或派生類使用者都無法直接訪問。86保護(hù)繼承(public)

保護(hù)繼承方式創(chuàng)建的派生類對基類各種成員訪問權(quán)限如下:基類的公有成員和保護(hù)成員都相當(dāng)于派生類的保護(hù)成員,派生類可以通過自身的成員函數(shù)或其子類的成員函數(shù)訪問他們對于基類的私有成員,無論派生類內(nèi)部成員或派生類使用者都無法直接訪問87基類成員在派生類中的訪問控制

publicprotectedprivatepublicpublicprotected不可訪問protectedprotectedprotected不可訪問privateprivateprivate不可訪問基類訪問屬性派生類中類型繼承方式88派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類構(gòu)造函數(shù)的一般形式為: 派生類名::派生類名(參數(shù)總表):基類名1(參數(shù)表1),…,基類名n(參數(shù)表n), 內(nèi)嵌對象名1(對象參數(shù)表1),…,內(nèi)嵌對象名m(對象參數(shù)表m)

{

派生類新增加成員的初始化;

}89

31派生類的構(gòu)造函數(shù)派生類也有構(gòu)造函數(shù),用以完成對象的初始化工作。派生類的構(gòu)造函數(shù)有兩個(gè)主要功能:初始化基類對象和初始化派生類中的所有數(shù)據(jù)成員。當(dāng)定義一個(gè)派生類的對象時(shí),先調(diào)用基類的構(gòu)造函數(shù),然后再調(diào)用派生類的構(gòu)造函數(shù)。90構(gòu)造函數(shù)的執(zhí)行順序1)基類構(gòu)造函數(shù),如果有多個(gè)基類則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們在成員初始化表中的順序。2)成員類對象的構(gòu)造函數(shù),如果有多個(gè)成員類對象,則構(gòu)造函數(shù)的調(diào)用順序是對象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序。3)派生類構(gòu)造函數(shù),作為一般規(guī)則,派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕悩?gòu)造函數(shù)。9132派生類的析構(gòu)函數(shù)形式派生類名::~派生類名({ …}派生類及基類的析構(gòu)函數(shù)沒有什么聯(lián)系,彼此獨(dú)立,派生類或基類的析構(gòu)函數(shù)只作各自類對象消亡前的善后工作

92析構(gòu)函數(shù)的調(diào)用順序1)派生類析構(gòu)函數(shù)。2)派生類的類數(shù)據(jù)成員析構(gòu)函數(shù)。3)基類析構(gòu)函數(shù)。93派生類調(diào)用構(gòu)造函數(shù)一般形式說明9433多態(tài)性多態(tài)性含義實(shí)現(xiàn)“一種接口,多種方法”的技術(shù)某類的對象在接受同樣的消息時(shí),做出不同的響應(yīng)多態(tài)性的形式編譯時(shí)多態(tài)性

編譯器對源程序進(jìn)行編譯時(shí)就可以確定所調(diào)用的是哪一個(gè)函數(shù),編譯時(shí)多態(tài)性通過重載來實(shí)現(xiàn);函數(shù)重載運(yùn)算符重載

運(yùn)行時(shí)多態(tài)性

在程序運(yùn)行過程中根據(jù)具體情況來確定調(diào)用的是哪一個(gè)函數(shù);虛函數(shù)34派生類對象替換基類對象

原則:凡是基類對象出現(xiàn)的場合都可以用公有派生類對象取代

形式

(1)派生類對象給基類對象賦值(2

溫馨提示

  • 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

提交評論