版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大學(xué)C老師親自總結(jié)要點(diǎn)大學(xué)C老師親自總結(jié)要點(diǎn)大學(xué)C老師親自總結(jié)要點(diǎn)1數(shù)組一維數(shù)組的定義一般語(yǔ)法形式數(shù)據(jù)類型數(shù)組名[常量表達(dá)式]例:inta[10]floats[5]一維數(shù)組初始化在定義一個(gè)數(shù)組的同時(shí)對(duì)數(shù)組元素賦初值例:inta[5]={1,2,3,4,5},b;可以僅對(duì)一部分下標(biāo)元素賦初值例:inta[5]={1,2,3};對(duì)數(shù)組中全部元素賦初值為0例:inta[5]={0};如果對(duì)數(shù)組的元素全部賦初值,可以省略定義元素個(gè)數(shù)例:inta[]={1,2,3,4,5,6};二維數(shù)組二維數(shù)組的定義一般語(yǔ)法形式數(shù)據(jù)類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]例:inta[3][5];floats[6][3];二維數(shù)組初始化在定義一個(gè)數(shù)組的同時(shí)對(duì)數(shù)組元素賦初值例:inta[2][5]={{1,2,3,4,5},{4,5,6,7,8}};將各元素的初值寫在一個(gè)大括號(hào)里例:inta[2][5]={1,2,3,4,5,6,7,8,9,0};可以僅對(duì)一部分下標(biāo)元素賦初值例:inta[2][5]={{1,2},{3,4,5}};例:inta[2][5]={1,2,3,4,5,6};對(duì)數(shù)組中全部元素賦初值為0例:inta[2][5]={0};2字符數(shù)組和字符串字符數(shù)組的定義在C++的基本數(shù)據(jù)類型變量中沒有字符串變量,采用字符型數(shù)組來存放字符串。字符型數(shù)組定義的一般語(yǔ)法形式為:
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指針變量的聲明一般語(yǔ)法格式數(shù)據(jù)類型*指針變量名;其中:數(shù)據(jù)類型----可以是任意類型,指的是指針?biāo)赶虻膶?duì)象的數(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)在聲明語(yǔ)句中的被聲明變量之前時(shí),表示被聲明的變量是指針變量。如:int*p; *出現(xiàn)在執(zhí)行語(yǔ)句中或聲明語(yǔ)句的初值表達(dá)式中時(shí),表示訪問指針?biāo)笇?duì)象的內(nèi)容。如:cout<<*p;&取地址運(yùn)算符,用來得到一個(gè)對(duì)象的地址
&出現(xiàn)在聲明語(yǔ)句中的被聲明變量之前時(shí),表示聲明的引用。如:int&x; &出現(xiàn)在執(zhí)行語(yǔ)句中或聲明語(yǔ)句的初值表達(dá)式中時(shí),表示取對(duì)象的地址。 如: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動(dòng)態(tài)存儲(chǔ)分配一般語(yǔ)法形式new數(shù)據(jù)類型[整型表達(dá)式1][整型表達(dá)式2]……;其中:數(shù)據(jù)類型表示要申請(qǐng)何種數(shù)據(jù)類型的存儲(chǔ)空間整型表達(dá)式表示每一維數(shù)組的長(zhǎng)度功能:動(dòng)態(tài)為一維或多維數(shù)組申請(qǐng)存儲(chǔ)空間如果申請(qǐng)分配成功,返回?cái)?shù)組的指針,失敗則返回空指針null。8釋放動(dòng)態(tài)分配存儲(chǔ)空間一般語(yǔ)法形式delete[]指針;功能:用于釋放動(dòng)態(tài)申請(qǐng)的數(shù)組存儲(chǔ)空間#include<iostream>usingnamespacestd;
voidmain(){
int*a,i,n;
cout<<"請(qǐng)輸入1班同學(xué)的人數(shù):"; cin>>n;
a=newint[n];
for(i=0;i<n;i++) { cout<<"請(qǐng)輸入1班"<<i+1<<"號(hào)同學(xué)的成績(jī):"; cin>>a[i];}
cout<<endl; for(i=0;i<n;i++) { cout<<"1班"<<i+1<<"號(hào)同學(xué)的成績(jī)是:"; cout<<a[i]<<endl;} cout<<endl;delete[]a;}自定義數(shù)據(jù)類型9結(jié)構(gòu)體結(jié)構(gòu)體是由不同數(shù)據(jù)類型的數(shù)據(jù)組成的集合體結(jié)構(gòu)體聲明語(yǔ)句的語(yǔ)法形式:struct結(jié)構(gòu)名{
數(shù)據(jù)類型說明符1成員名1; 數(shù)據(jù)類型說明符2成員名2;
︰︰
數(shù)據(jù)類型說明符n成員名n;};結(jié)構(gòu)體類型變量聲明的語(yǔ)法形式:結(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ù)定義的語(yǔ)法形式類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表){
語(yǔ)句序列}函數(shù)的類型和返回值函數(shù)的類型----類型標(biāo)識(shí)符規(guī)定了函數(shù)的類型,也就是函數(shù)的返回值的數(shù)據(jù)類型函數(shù)的返回值----是指需要返回給主調(diào)函數(shù)的處理結(jié)果,由return語(yǔ)句給出。如:return0;returny;等無返回值的函數(shù)其類型標(biāo)識(shí)符為void,不必寫return語(yǔ)句形式參數(shù)形式參數(shù)(簡(jiǎn)稱形參)表的內(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ù)(簡(jiǎn)稱實(shí)參)賦予形參,并執(zhí)行該函數(shù)過程函數(shù)的調(diào)用函數(shù)調(diào)用的語(yǔ)法形式
函數(shù)名(實(shí)參列表)實(shí)參列表中應(yīng)給出及函數(shù)形參個(gè)數(shù)相同、類型相符的實(shí)參(實(shí)參可以是:常量、變量和表達(dá)式)例如:(3,x,5*a+b,……)函數(shù)調(diào)用可以作為語(yǔ)句,這時(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ù)原型語(yǔ)法形式:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表);注意:在函數(shù)調(diào)用之前對(duì)所調(diào)用的函數(shù)進(jìn)行聲明,指出該函數(shù)的返回值的類型以及形參的個(gè)數(shù)和類型,編譯器據(jù)此信息對(duì)函數(shù)調(diào)用進(jìn)行語(yǔ)法檢查,保證形參和實(shí)參的個(gè)數(shù)和類型的一致性,保證返回值的使用正確性。13函數(shù)重載函數(shù)重載兩個(gè)以上的函數(shù),取相同的函數(shù)名,但是形參的個(gè)數(shù)或者類型不同,編譯器根據(jù)實(shí)參和形參的類型及個(gè)數(shù)的最佳匹配,自動(dòng)確定調(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ā)生了怎樣的改變,都不會(huì)影響到實(shí)參引用調(diào)用引用調(diào)用可以使在子函數(shù)中對(duì)形參所做的更改對(duì)主函數(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ù)(又稱庫(kù)函數(shù)或標(biāo)準(zhǔn)函數(shù)),對(duì)于系統(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)用語(yǔ)句處定義內(nèi)聯(lián)函數(shù)的語(yǔ)法形式inline類型說明符被調(diào)函數(shù)名(含類型說明符的形參表)注意:內(nèi)聯(lián)函數(shù)體內(nèi)一般不能有循環(huán)語(yǔ)句和switch語(yǔ)句內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在第一次被調(diào)用之前通常內(nèi)聯(lián)函數(shù)應(yīng)該是比較簡(jiǎn)單的函數(shù),結(jié)果簡(jiǎn)單、語(yǔ)句少如果將一個(gè)復(fù)雜的函數(shù)定義為內(nèi)聯(lián)函數(shù),會(huì)造成代碼膨脹,增大開銷#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ì)算類和對(duì)象4618類的定義在C++中聲明類的一般形式為:class<類名>{
數(shù)據(jù)成員聲明;
成員函數(shù)聲明; …………;
};<各個(gè)成員函數(shù)的實(shí)現(xiàn)>;變量聲明函數(shù)原型聲明
類的定義包含兩部分:類頭和類體,類頭由關(guān)鍵字class及其后面的類名構(gòu)成;類體由一對(duì)大括號(hào)包圍起來,一般情況下,類定義后面接一個(gè)分號(hào)。
別忘了必須用分號(hào)結(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ù)成員聲明的一般形式:
類型名對(duì)象名;例如:
intx;缺省了訪問權(quán)限定義,數(shù)據(jù)成員整型變量x為私有數(shù)據(jù)成員5020類的成員函數(shù)成員函數(shù)的聲明和定義函數(shù)的原型聲明要寫在類的主體中,原型說明了函數(shù)的形參表和返回值類型。而函數(shù)的具體定義是寫在類定義之外的。及普通函數(shù)不同的是,定義函數(shù)時(shí)要指明類的具體名稱。成員函數(shù)定義的一般形式:函數(shù)類型類名::成員函數(shù)名([形參表]){
函數(shù)體}5121對(duì)象聲明了數(shù)據(jù)類型“類”之后,就可以像定義int、float等數(shù)據(jù)類型變量那樣去建立類的變量。只是將“類”類型的變量叫類對(duì)象,或類實(shí)例(實(shí)體)。這個(gè)所謂的“對(duì)象”是指將一組和使用該數(shù)據(jù)的一組操作或過程封裝起來,形成獨(dú)立的實(shí)體。這樣必須定義實(shí)體的變量。對(duì)類來說就是為該類定義一個(gè)對(duì)象。52定義類對(duì)象稱為類的實(shí)例化類對(duì)象定義的一般形式:
1、類名類對(duì)象名;
例如:Pointa;
2、類名類對(duì)象指針名;
例如:Point*p;
注意:p=newPoint;動(dòng)態(tài)創(chuàng)建一個(gè)對(duì)象
p=&a;獲取已定義對(duì)象的地址
deletep;動(dòng)態(tài)創(chuàng)建的對(duì)象可在不需要時(shí)釋放5322對(duì)象成員的引用數(shù)據(jù)成員對(duì)象名.成員名
或:對(duì)象指針名->成員名例:a.xa.y或p->xp->y成員函數(shù)對(duì)象名.
成員名(參數(shù)表)或:對(duì)象指針名->成員名(參數(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)用便自動(dòng)執(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)建類的對(duì)象時(shí),編譯器會(huì)自動(dòng)調(diào)用類的“構(gòu)造函數(shù)”可以在構(gòu)造函數(shù)中執(zhí)行初始化成員變量的操作。57構(gòu)造函數(shù)的形式參數(shù)Point(){x=0;y=0;}//定義無參構(gòu)造函數(shù)對(duì)應(yīng)的類對(duì)象聲明:Pointa;Point(intx1,inty1){x=x1;y=y1;}
//定義有參構(gòu)造函數(shù)對(duì)應(yīng)的類對(duì)象聲明: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ù)對(duì)應(yīng)的類對(duì)象聲明: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ù),編譯器會(huì)自動(dòng)生成一個(gè)不帶參數(shù)的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù),在程序中定義一個(gè)對(duì)象而沒有指明初始化時(shí),編譯器便按默認(rèn)構(gòu)造函數(shù)來初始化該對(duì)象。classPoint{public:
Point(){} ...}61
對(duì)象指針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é)果如下:注意:在動(dòng)態(tài)創(chuàng)建對(duì)象時(shí),要調(diào)用類的構(gòu)造函數(shù)。6224拷貝(初始化)構(gòu)造函數(shù)概念:拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)的形參為本類對(duì)象的引用。作用:當(dāng)使用同類型的對(duì)象初始化另一個(gè)對(duì)象時(shí),不能簡(jiǎn)單的將一個(gè)對(duì)象的數(shù)據(jù)成員直接拷貝給另一個(gè)對(duì)象。為了達(dá)到對(duì)象整體復(fù)制的目的,需要定義一個(gè)特殊的構(gòu)造函數(shù):拷貝構(gòu)造函數(shù)。63拷貝構(gòu)造函數(shù)聲明形式為:class類名{public:
類名(形參);//構(gòu)造函數(shù)類名(類名&對(duì)象名);//拷貝構(gòu)造函數(shù)
...};類名::類名(類名&對(duì)象名)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){函數(shù)體}64需要注意:拷貝構(gòu)造函數(shù)是將已知對(duì)象的數(shù)據(jù)成員的值拷貝給正在創(chuàng)建的同類的對(duì)象拷貝構(gòu)造函數(shù)只能有一個(gè)參數(shù),并且是對(duì)某個(gè)對(duì)象的引用每個(gè)類必須有一個(gè)拷貝初始化構(gòu)造函數(shù),若沒有顯式說明,則系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)的拷貝初始化構(gòu)造函數(shù)6525析構(gòu)函數(shù)的引出問題的提出:對(duì)象消失時(shí)應(yīng)做一些掃尾工作?一個(gè)類的對(duì)象在生命期間分配了資源,這些資源需要在對(duì)象不復(fù)存在以前被釋放.(例如,如果構(gòu)造函數(shù)中動(dòng)態(tài)分配了內(nèi)存,這塊內(nèi)存在對(duì)象消失之前必須被釋放.)
及構(gòu)造函數(shù)對(duì)應(yīng)的是析構(gòu)函數(shù),當(dāng)一個(gè)對(duì)象消失時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用類的析構(gòu)函數(shù)。66析構(gòu)函數(shù)析構(gòu)函數(shù)名字:符號(hào)“~”+類名析構(gòu)函數(shù)沒有參數(shù)沒有返回值.一個(gè)類中只可能定義一個(gè)析構(gòu)函數(shù),所以析構(gòu)函數(shù)不能重載。析構(gòu)函數(shù)在對(duì)象生命期結(jié)束時(shí)被編譯器自動(dòng)調(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ù),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)析構(gòu)函數(shù),其格式如下:
<類名>::~<默認(rèn)析構(gòu)函數(shù)名>(){}默認(rèn)析構(gòu)函數(shù)是一個(gè)空函數(shù)69析構(gòu)函數(shù)的自動(dòng)調(diào)用
當(dāng)對(duì)象超出其定義范圍時(shí)(即釋放該對(duì)象時(shí)),編譯器自動(dòng)調(diào)用析構(gòu)函數(shù)。在以下情況下,析構(gòu)函數(shù)也會(huì)被自動(dòng)調(diào)用。如果一個(gè)對(duì)象被定義在一個(gè)函數(shù)體內(nèi),則當(dāng)這個(gè)函數(shù)結(jié)束時(shí),該對(duì)象的析構(gòu)函數(shù)被自動(dòng)調(diào)用若一個(gè)對(duì)象是使用new運(yùn)算符動(dòng)態(tài)創(chuàng)建的,在使用delete運(yùn)算符釋放它時(shí),delete將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)70構(gòu)造函數(shù)及析構(gòu)函數(shù)
構(gòu)造函數(shù)和析構(gòu)函數(shù)是兩個(gè)非常特殊的函數(shù):它們都沒有返回值。
對(duì)于構(gòu)造函數(shù)和析構(gòu)函數(shù)而言,我們?cè)诙x的時(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ī)制使類及類之間建立一種上下級(jí)的層次關(guān)系,通過繼承,從現(xiàn)有類中獲得其屬性和行為,并對(duì)其覆蓋、改寫、新增,產(chǎn)生新類所需要的功能。創(chuàng)建新類時(shí),無須從頭編寫數(shù)據(jù)成員和成員函數(shù),只需要選擇合適的基類,派生類可以增加自己的數(shù)據(jù)成員和成員函數(shù),因此派生類比基類更強(qiáng)大,繼承真正的優(yōu)越性來自于可以在派生類中對(duì)基類特征的追加、替代和精簡(jiǎn)。78基本概念繼承及派生繼承----從現(xiàn)有類中繼承其屬性和行為,產(chǎn)生新類。派生----利用現(xiàn)有類的屬性和行為,派生出新類?;?、派生類從一個(gè)類派生出另一個(gè)類時(shí),原始類稱為基類(或者父類、超類),新類稱為派生類(或者子類)。7928單一繼承和多重繼承
在C++中有兩種繼承:?jiǎn)我焕^承和多重繼承。對(duì)于單一繼承,派生類只有一個(gè)基類,對(duì)于多重繼承,派生類可以有多個(gè)基類。單一繼承A類B類多重繼承A類B類C類D類8029派生類的定義格式class派生類名:繼承方式基類名{
派生類增加的成員聲明;};
1,繼承方式基類名2,…,繼承方式基類名n81派生類的定義形式class派生類名:基類名
{
派生類成員;};繼承方式可以使用關(guān)鍵字public表示公有繼承,或者使用關(guān)鍵字private表示私有繼承,或者使用關(guān)鍵字protected表示保護(hù)繼承,最常見的是公有繼承。繼承方式82派生類的語(yǔ)法結(jié)構(gòu)class<派生類名>:<繼承方式><基類名>{
private: 新增私有數(shù)據(jù)成員和成員函數(shù)
protected: 新增保護(hù)數(shù)據(jù)成員和成員函效
public: 新增公有數(shù)據(jù)成員和成員函效}8330派生類的繼承方式私有繼承private公有繼承public
保護(hù)繼承protected84公有繼承(public)
公有繼承方式創(chuàng)建的派生類對(duì)基類各種成員訪問權(quán)限如下:基類公有成員相當(dāng)于派生類的公有成員,即派生類可以象訪問自身公有成員一樣訪問從基類繼承的公有成員?;惐Wo(hù)成員相當(dāng)于派生類的保護(hù)成員,即派生類可以象訪問自身的保護(hù)成員一樣,訪問基類的保護(hù)成員。對(duì)于基類的私有成員,派生類內(nèi)部成員無法直接訪問。派生類使用者也無法通過派生類對(duì)象直接訪問。85私有繼承
(private)派生類對(duì)基類各種成員訪問權(quán)限如下:基類公有成員和保護(hù)成員都相當(dāng)于派生類的私有成員,派生類只能通過自身的函數(shù)成員訪問他們對(duì)于基類的私有成員,無論派生類內(nèi)部成員或派生類使用者都無法直接訪問。86保護(hù)繼承(public)
保護(hù)繼承方式創(chuàng)建的派生類對(duì)基類各種成員訪問權(quán)限如下:基類的公有成員和保護(hù)成員都相當(dāng)于派生類的保護(hù)成員,派生類可以通過自身的成員函數(shù)或其子類的成員函數(shù)訪問他們對(duì)于基類的私有成員,無論派生類內(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)嵌對(duì)象名1(對(duì)象參數(shù)表1),…,內(nèi)嵌對(duì)象名m(對(duì)象參數(shù)表m)
{
派生類新增加成員的初始化;
}89
31派生類的構(gòu)造函數(shù)派生類也有構(gòu)造函數(shù),用以完成對(duì)象的初始化工作。派生類的構(gòu)造函數(shù)有兩個(gè)主要功能:初始化基類對(duì)象和初始化派生類中的所有數(shù)據(jù)成員。當(dāng)定義一個(gè)派生類的對(duì)象時(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)的順序而不是它們?cè)诔蓡T初始化表中的順序。2)成員類對(duì)象的構(gòu)造函數(shù),如果有多個(gè)成員類對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類中被聲明的順序而不是它們出現(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ù)只作各自類對(duì)象消亡前的善后工作
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ù)某類的對(duì)象在接受同樣的消息時(shí),做出不同的響應(yīng)多態(tài)性的形式編譯時(shí)多態(tài)性
編譯器對(duì)源程序進(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派生類對(duì)象替換基類對(duì)象
原則:凡是基類對(duì)象出現(xiàn)的場(chǎng)合都可以用公有派生類對(duì)象取代
形式
(1)派生類對(duì)象給基類對(duì)象賦值(2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 買山墓地合同范例
- 另星供貨合同模板
- (2024版)大型購(gòu)物中心招商租賃合同
- 04版教育培訓(xùn)合同培訓(xùn)內(nèi)容、培訓(xùn)時(shí)間及費(fèi)用
- 2024年城市軌道交通設(shè)施拆除合同
- 2024關(guān)于行政合同中行政主體特權(quán)行使的司法審查
- 水墨畫基礎(chǔ)知識(shí)單選題100道及答案解析
- 建筑施工安裝分包合同:住宅項(xiàng)目
- 印章保管與維護(hù)技術(shù)更新
- 停車場(chǎng)衛(wèi)生間裝修施工合同
- 《預(yù)防未成年人犯罪》課件(圖文)
- 計(jì)算機(jī)專業(yè)職業(yè)生涯規(guī)劃書(14篇)
- GB/T 22838.5-2024卷煙和濾棒物理性能的測(cè)定第5部分:卷煙吸阻和濾棒壓降
- 評(píng)標(biāo)專家?guī)煜到y(tǒng)系統(tǒng)總體建設(shè)方案
- 學(xué)校學(xué)生食堂“三防”制度
- 創(chuàng)新實(shí)踐(理論)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 市三級(jí)公立綜合醫(yī)院績(jī)效考核指標(biāo)評(píng)分細(xì)則
- 四年級(jí)教材《勞動(dòng)》課件
- 全國(guó)仿真職業(yè)技能競(jìng)賽考試題庫(kù)及答案
- 手動(dòng)液壓叉車安全技術(shù)培訓(xùn)
- 小學(xué)一年級(jí)上冊(cè) 綜合實(shí)踐教學(xué)課件
評(píng)論
0/150
提交評(píng)論