版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
計算機(jī)程序設(shè)計2013.1C++語言概述——面向?qū)ο蟮某绦蛟O(shè)計語言
C++支持?jǐn)?shù)據(jù)封裝
C++類中包含私有、公有和保護(hù)成員
C++通過發(fā)送消息來處理對象
C++中允許友元破壞封裝性
C++允許函數(shù)名和運(yùn)算符重載
C++支持繼承性
C++支持動態(tài)聯(lián)編在C++中,結(jié)構(gòu)可作為一種特殊的類,它雖然可以包含函數(shù),但它沒有私有或保護(hù)的成員。在C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實現(xiàn)。類是類型,是對象的抽象,對象是類的具體實例。一個類可以有多個對象,每個對象都有自己的存儲單元,而類不占存儲單元。C++中類是數(shù)據(jù)和函數(shù)的封裝體,它提供一種數(shù)據(jù)訪問嚴(yán)格控制的機(jī)制,數(shù)據(jù)被隱藏在封裝體中,該封裝體通過操作接口與外界交換信息。送到一個對象的所有可能的消息都需要在對象的類描述中加以定義,即對每個可能的消息給出一個相應(yīng)的辦法。方法是在類中使用函數(shù)來定義的,使用一種類似于函數(shù)調(diào)用的機(jī)制把消息發(fā)送到一個對象上。友元可以是在類外定義的函數(shù),也可以是在類外定義的整個類。友元可以訪問類的私有成員。C++中可以通過定義虛函數(shù)來支持動態(tài)聯(lián)編。面向?qū)ο蟮某绦蛟O(shè)計的(四)三大特征: (抽象)、封裝、繼承、多態(tài)。C++與C語言的關(guān)系:C語言是C++的一個子集,C++包含了C語言的全部內(nèi)容。
C++保持與C語言的兼容
C++對C語言作了很多改進(jìn)
C++與C語言的本質(zhì)差別在于C++是面向?qū)ο蟮?,而C語言是面向過程的。(1)增加了一些新的運(yùn)算符,如::,new,delete,->*等;(2)改進(jìn)了類型系統(tǒng),增加了安全性;(3)引進(jìn)了引用的概念,使用引用作函數(shù)參數(shù)帶來了很大方便;(4)允許函數(shù)重載,允許設(shè)置缺省參數(shù),提高了編程的靈活性;(5)引進(jìn)內(nèi)聯(lián)函數(shù),提高了程序效率;(6)可根據(jù)需要隨時對變量進(jìn)行說明。面向過程的程序設(shè)計將數(shù)據(jù)和對數(shù)據(jù)的操作分離,程序是由一個個的函數(shù)組成的,面向?qū)ο蟮某绦蛟O(shè)計將數(shù)據(jù)和操作封裝在一起,程序是由一個個對象組成的,對象之間通過接口進(jìn)行通信,它能夠較好地支持程序代碼的復(fù)用。C++數(shù)據(jù)操作基礎(chǔ)2.1C++程序進(jìn)行輸入和輸出的操作方法
#include<iostream.h>
intmain(){
intx,y;//定義兩個整型變量
cin>>x>>y;//鍵盤輸入變量值
cout<<“x=”<<x<<endl<<“y=”<<y<<endl;//按格式屏幕
return0; 輸出變量值}cin是一個代表標(biāo)準(zhǔn)輸入設(shè)備(一般代表鍵盤設(shè)備)的對象,
cout是一個代表標(biāo)準(zhǔn)輸出設(shè)備(一般代表顯示設(shè)備)的對象,它們都是C++系統(tǒng)預(yù)定義的對象。它們以及輸入操作符“>>”和輸出操作符“<<”都在頭文件
iostream.h中被聲明。2.2控制結(jié)構(gòu) 順序、分支(條件)、循環(huán)、轉(zhuǎn)移2.2.1條件語句
if語句
if…else語句
if…elseif語句
?條件操作符
switch語句if(條件表達(dá)式){語句序列}if(條件表達(dá)式){語句序列1}else{語句序列2}if(條件表達(dá)式1){
語句序列1}elseif(條件表達(dá)式2){語句序列2}elseif(條件表達(dá)式3){語句序列3}else{語句序列4}if(條件表達(dá)式1){
if(條件表達(dá)式2) { 語句序列1 }
else { 語句序列2 }}//未避免嵌套出現(xiàn)二義性,C++規(guī)定else子句總與其之前最近且尚未配對的if語句配對。?是一個三元操作符,被稱為條件操作符。使用語法是:
表達(dá)式1?表達(dá)式2:表達(dá)式3
等價于:
if(表達(dá)式1)
表達(dá)式2;
else
表達(dá)式3;例:result=(a>=0)?a:-a
注意:表達(dá)式1、2、3的數(shù)據(jù)類型不能是void
類型。switch(變量名){
case值1:語句序列1;
break;
case值2:語句序列2;
break;……
default:語句序列n;}2.2.2循環(huán)語句
for
循環(huán):for(exp1;exp2;exp3){statement;….}while
循環(huán):while(expression){……}do…while
循環(huán):do{statement;…...}while(expression);三種循環(huán)都可以嵌套。
for(exp1;exp2;exp3){statement;….}等價于:
exp1;while(exp2){statement;……exp3;}例: intsum=0; for(intI=1;I<=10;I++)sum+=I;2.2.3轉(zhuǎn)移語句
break
語句: 強(qiáng)制退出循環(huán)及中斷case語句,直接 執(zhí)行循環(huán)體后的語句。 continue語句:不完全退出循環(huán),而是使循環(huán)重 新回到測試位置,并忽略此語句至循環(huán)結(jié)束前 的語句序列。 goto語句:無條件轉(zhuǎn)移,只限在同一程序段內(nèi)轉(zhuǎn)換, 不能跳到另一函數(shù)或程序內(nèi)。2.3數(shù)組、字符串和指針2.3.1數(shù)組1.數(shù)組對象聲明
數(shù)據(jù)類型標(biāo)識符[常量表達(dá)式]2.說明
(1)
數(shù)組中的每個元素具有相同數(shù)據(jù)類型;
inta[5];
(2)
訪問數(shù)組元素時,使用下標(biāo)值指明,第一個元素 下標(biāo)值為0;
a[2]=12;
(3)
數(shù)組內(nèi)各元素在內(nèi)存中連續(xù)存放;(4)數(shù)組在聲明的同時可以賦初值,初值個數(shù)小于等于數(shù)組元素個數(shù),若小于,未提供初值的元素使用缺省值初始化;若等于,數(shù)組長度可以不指定。
inta[5]={1,2};floatb[]={1.0,2.5,3.2,4.9};(5)
多維數(shù)組的每一維大小都用[]單獨(dú)括起,賦初值時按行賦給,初值個數(shù)同樣小于等于每一維的元素個數(shù)。
例:inta[][3]={{2,3,4},{3,4,5},{1}};
intb[3][2]={{0,1},{2}};
intc[2][]={{1,2},{2,3},{3,4}};//error只有外層數(shù)組的元素個數(shù)可以省略(6)
使用sizeof
函數(shù)求數(shù)組元素個數(shù)
inta[5]={2,3,5};floatb[][3]={{1.,2.,3.},{2,3}};intaNum=sizeof(a)/sizeof(int);intbNum=sizeof(b)/sizeof(float[3]);3.使用數(shù)組時的注意事項
(1)兩個數(shù)組對象之間不能相互賦值;
inta[5],b[5];a=b;//error
(2)數(shù)組類型的操作數(shù)不能作為左值使用;
a++;//error
(3)
數(shù)組不能作為參數(shù)在函數(shù)之間進(jìn)行參數(shù)傳遞,只能通過向函數(shù)傳遞指向數(shù)組對象的第一個元素對象的指針來達(dá)到傳遞數(shù)組的效果。例:voidf(int*p,intn){
while
(n-->0)cout<<*p++<<endl;}intmain(){inta[]={1,2,3,4,5};f(a,sizeof(a)/sizeof(int));
return0;}(4)
C++運(yùn)行系統(tǒng)不能對數(shù)組訪問的越界問題(下標(biāo)值不正確)進(jìn)行檢查。2.3.2字符串與字符數(shù)組的關(guān)系:字符串是由一串字符組成的數(shù)組,但字符串的末尾一定是“\0”,而字符數(shù)組則不一定。與字符串有關(guān)的標(biāo)準(zhǔn)函數(shù):
gets,puts fgets,fputs sprintf strcpy(str1,str2)strcat(str1,str2) strcmp(str1,str2)strlen(str)2.3.3指針
1.
定義:包含另一變量內(nèi)存地址的變量。
3.
指針與數(shù)組的關(guān)系
數(shù)組是指針的另一種表示法。數(shù)組的名字實際就是數(shù)組的起始地址。 intarr[2]={0,1}; arr[1]和*(arr+1)是完全一致的。2.
聲明
指針在使用前需進(jìn)行聲明,聲明格式為:數(shù)據(jù)類型*變量;或數(shù)據(jù)類型*變量;4.對指針值的操作例:#include<iostream.h>intmain(){inta[]={1,2,3,4,5};int*IntPtr(&a[0]);int*Endofa(&a[4]);
while
(IntPtr<=Endofa) {cout<<*IntPtr++<<endl;}
return0;}(1)可以對指針值進(jìn)行算術(shù)和關(guān)系操作;(2)只能在同類型的指針值之間進(jìn)行關(guān)系比較操作,而且被比較的兩個指針值指向同一數(shù)組對象的元素對象;(3)一個指針值可以與整數(shù)
0
進(jìn)行相等或不等關(guān)系操作5.
“&”與“*”“&”是一個一元操作符,它操作一個對象,得到該對象的存儲單元的地址值;
例:inti;int*p;p=&i;*p=*p+5;說明:“&”后必須跟左值表達(dá)式,而由“*”與其后的指針表達(dá)式形成的整個表達(dá)式也是左值表達(dá)式。左值表達(dá)式指程序中表達(dá)一個對象標(biāo)識(對象引用)的表達(dá)式,因它可以放在賦值操作符的左邊而得名。詳細(xì)內(nèi)容參見參考書[2]p164~165?!?”也是一個一元操作符,用于表達(dá)被指針指向的對象。6.new與delete
new
用于為指針分配內(nèi)存空間;delete用于釋放指針?biāo)加械膬?nèi)存空間。
例:int*p;p=newint;//……deletep;兩種內(nèi)存分配方式:堆棧分配和堆內(nèi)空間分配。標(biāo)準(zhǔn)C用malloc和free函數(shù)在堆內(nèi)分配內(nèi)存塊和釋放內(nèi)存塊。(2)當(dāng)表達(dá)式中出現(xiàn)一個數(shù)組類型的操作數(shù)時,這個操作數(shù)被自動地強(qiáng)制為指向該操作數(shù)所標(biāo)識的數(shù)組對象的第一個元素對象的指針值。下面兩個賦值表達(dá)式是等價的:
inta[]={1,2,3};int*p;
p=a;p=&a[0];7.使用指針時的注意事項(1)在程序中注意保持指針值的確定性,避免出現(xiàn)懸空指針。因此在聲明一個指針時,應(yīng)立即對它進(jìn)行初始化或賦初值;2.4函數(shù)2.4.1函數(shù)定義
函數(shù)是由功能相關(guān)的語句序列所組成的獨(dú)立模塊,是結(jié)構(gòu)化程序的基本結(jié)構(gòu)。函數(shù)類型函數(shù)名{數(shù)據(jù)類型參數(shù)1,………}{
函數(shù)體(語句序列)
}說明:函數(shù)類型指的是函數(shù)的返回值類型;若未設(shè)置函數(shù)類型,系統(tǒng)會自動將其假設(shè)為整數(shù)類型;若不希望函數(shù)返回任何值,就將函數(shù)類型設(shè)置為
void。2.4.2函數(shù)調(diào)用
當(dāng)一個函數(shù)定義有形參時,在進(jìn)行函數(shù)調(diào)用時,必須提供與形參個數(shù)、類型相同的實參。在C++中,有兩種參數(shù)傳遞機(jī)制將實參的值傳遞給形參:值傳遞(值調(diào)用)和引用傳遞(引用調(diào)用)。1.值傳遞
在這種機(jī)制中,實參的值被拷貝到由相應(yīng)形參名字所標(biāo)識的對象中。在函數(shù)內(nèi)部對形參的訪問或更新都是是對這個對象的訪問或更新。實參本身的值在調(diào)用前后和調(diào)用過程中都不發(fā)生變化。intdouble(inta){a*=2;cout<<“a=“<<a<<endl;returna;}#include<iostream.h>voidmain(){intb=10;double(b);cout<<“b=“<<b;}運(yùn)行結(jié)果:
a=20b=102.引用傳遞
若希望通過函數(shù)調(diào)用改變實參的值,就必須采用引用傳遞機(jī)制。關(guān)于引用的具體含義及使用要點(diǎn)將在3.7節(jié)中講解。2.4.3函數(shù)的其他特性1.缺省參數(shù)
函數(shù)聲明時可以為一個或多個參數(shù)指定缺省參數(shù)值。 voiddelay(intx,inty=100);
當(dāng)進(jìn)行函數(shù)調(diào)用時,編譯器按從左至右的順序?qū)崊⑴c形參結(jié)合,若未指定足夠的實參,則編譯器按同樣的順序用函數(shù)聲明中的缺省值來補(bǔ)足所缺少的實參。
delay(5);
等價于
delay(5,100);
若函數(shù)有多個參數(shù),那么所有指定了缺省值的參數(shù)必須排在參數(shù)序列的最右邊。
voidf(intx,inty=0,intz);//errorf(2,4);
2.遞歸函數(shù)
在函數(shù)內(nèi)部直接或間接地調(diào)用函數(shù)本身,稱為遞歸調(diào)用。遞歸調(diào)用要注意設(shè)置出口,避免死循環(huán)。當(dāng)重載的函數(shù)帶有缺省參數(shù)時,必須注意避免錯誤聲明。
voidf(intx,inty=0);voidf(intx);//errorf(5);2.4.4函數(shù)重載
在C++中,允許兩個或兩個以上的函數(shù)采用相同的名字,只要使用不同類型、不同數(shù)目的參數(shù)或不同的返回值,編譯器便知道在什么情況下該調(diào)用哪個函數(shù),這就叫函數(shù)重載。例:intdoubleFun(intii){
return(2*ii);}
floatdoubleFun(floatff){
return(2*ff);}main(){intaa=1;floatbb=2.0;intisum;floatfsum;isun=doubleFun(aa);fsum=doubleFun(bb);}intdoubleFun(intii){
return(2*ii);}floatdoubleFun(int
ii){
return(2.0*ii);}注意:函數(shù)的返回類型不足以區(qū)分兩個重載函數(shù)。類與對象
主要內(nèi)容:
類的成員構(gòu)造函數(shù)與析構(gòu)函數(shù);內(nèi)聯(lián)成員函數(shù);靜態(tài)數(shù)據(jù)成員和成員函數(shù)類和對象的定義this指針,const關(guān)鍵字友元函數(shù)引用3.1類的定義
類是對一組客觀對象的抽象,它將該組對象所具有的共同特征(包括結(jié)構(gòu)特征和行為特征)集中起來,以說明該組對象的能力和性質(zhì)。類(class)是一種用戶自定義的數(shù)據(jù)類型。
class
類名稱
{ typevars; memberfunctions;
public: typevars; memberfunctions; };classCPerson{ charname;public: intage; floatheight; voidPrintAge(); voidPrintHeight();};注意:1.類名稱一般以“C”開頭,以區(qū)別于其他標(biāo)識符。如
classCPen {……}2.定義類,除了給出操作名和數(shù)據(jù)結(jié)構(gòu)外,還必須給出各個成員函數(shù)的實現(xiàn)。
CPen::MemberFunction(……)
{……}
由于不同的類允許有相同名稱的成員函數(shù),因此,在類外定義成員函數(shù)的實現(xiàn)時,必須在成員函數(shù)名前加上所屬類名和作用域操作符“::”。3.類中的數(shù)據(jù)(又稱數(shù)據(jù)成員)和函數(shù)(又稱成員函數(shù))分為三種類型,分別由三種訪問控制修飾符public,private,protected
加以修飾。public:指定其后的成員是公有的。它們是類與外部 的接口,任何外部函數(shù)都可以訪問公有數(shù)據(jù) 成員和成員函數(shù)。 這三種修飾符在類中可以任何次序出現(xiàn),用于修飾在它們之后列出的成員名字能被程序的其它部分訪問的權(quán)限。private:這一部分稱為私有部分。若省略關(guān)鍵字 private,則必須緊跟在類名稱后聲明。類中的數(shù)據(jù)和函數(shù)若不特別聲明,都被視為私有類型。 這種類型的數(shù)據(jù)只允許類本身聲明的成員函數(shù)對其進(jìn)行存取。classCPerson{ charname;public: intage; floatheight; voidPrintAge(); voidPrintHeight();};3.2對象的定義
對象是類的實例。對象可以在聲明類時直接定義,也可以在聲明類之后單獨(dú)定義。
class
CPerson {……}zhang;
或 classCPerson {……}; CPenzhang
;protected:保護(hù)類型,這種類型的數(shù)據(jù)也只能被類本 身的成員函數(shù)訪問,可以被派生類繼承。通過對象可以訪問類中的公有類型數(shù)據(jù)和成員函數(shù),其使用方式為:對象名.成員函數(shù)名對象名.數(shù)據(jù)成員例:zhang.age=20;zhang.PrintAge();=“zhanglei“;//error通過指向類類型對象的指針訪問類的公有數(shù)據(jù)成員和成員函數(shù)時,其使用方式為: 指針名->數(shù)據(jù)成員 指針名->成員函數(shù)例:CPerson*pWang;pWang->age=30;pWang->PrintAge();類和對象的關(guān)系就如同整型int與整型變量i之間的關(guān)系。3.3類的成員3.3.1構(gòu)造函數(shù)構(gòu)造函數(shù)是一個特殊的類成員函數(shù),用于初始化類變量或分配內(nèi)存空間。當(dāng)用類定義一個對象時,自動調(diào)用構(gòu)造函數(shù),使對象保持一個確定的狀態(tài)。1.構(gòu)造函數(shù)的聲明
classCExample { intI; public:
CExample(); …… };2.構(gòu)造函數(shù)的特點(diǎn)
(1)構(gòu)造函數(shù)與類必須具有相同的名字。例:classCExample{CExample();CExample(inti);CExample(intx,inty);
private:intmember1,member2;};
(2)創(chuàng)建對象時自動執(zhí)行構(gòu)造函數(shù),構(gòu)造函數(shù)不能在程序中被顯式調(diào)用。(3)構(gòu)造函數(shù)不需要函數(shù)類型,不能被繼承。(4)構(gòu)造函數(shù)可以接受參數(shù)并能夠重載。CExample::CExample(inti){member1=i;member2=0;}intmain(){CExampleex1;CExampleex2(1);CExampleex3(2,3);……}CExample::CExample(){member1=0;member2=0;}CExample::CExample(intx,inty){member1=x;member2=y;}(5)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類型初始化對象外,還可以使用已存在的同類型的對象即類類型的對象來初始化正在創(chuàng)建的對象。為此,必須在類中定義一個特殊的構(gòu)造函數(shù)來完成這個工作,這個構(gòu)造函數(shù)被稱為拷貝初始化構(gòu)造函數(shù)。例:classCMyClass{
public:CMyClass(intx=0);CMyClass(CMyClass&c);//……
private:intmember;};CMyClass::CMyClass(intx){member=x;}CMyClass::CMyClass(CMyClass&c){member=c.member;}注意:一是拷貝初始化構(gòu)造函數(shù)必須使用引用參數(shù);二是以值調(diào)用方式向一個函數(shù)傳遞參數(shù)時,拷 貝初始化函數(shù)也被調(diào)用。例:voidfun(CMyClassa); intmain() {CMyClassmy(5);fun(my);//…… }
(6)若程序沒有為一個類定義任何構(gòu)造函數(shù),則編譯器生成一個不帶參數(shù)的公有構(gòu)造函數(shù),這個構(gòu)造函數(shù)什么也不做,稱為缺省構(gòu)造函數(shù)。例:CExample::CExample { }3.3.2析構(gòu)函數(shù)
析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,也是類成員函數(shù),通常用于釋放已分配的內(nèi)存空間或完成對象被清除前的一些清理工作。
classCExample {
public: CExample(); voidPrint(); ~CExample(); …… };析構(gòu)函數(shù)的特點(diǎn):1.與構(gòu)造函數(shù)具有相同的名字,前面必須加上“~”符號。2.析構(gòu)函數(shù)沒有函數(shù)類型,不能被繼承。3.3.3內(nèi)聯(lián)成員函數(shù)成員函數(shù)的定義方法:體內(nèi)定義和體外定義。在類中定義的函數(shù)稱為內(nèi)聯(lián)函數(shù)。類外定義的函數(shù)缺省情況下都是非內(nèi)聯(lián)函數(shù)。用關(guān)鍵字inline
可以強(qiáng)制轉(zhuǎn)換。3.析構(gòu)函數(shù)不能帶有參數(shù),而且不可以重載。4.析構(gòu)函數(shù)在
結(jié)束時被自動調(diào)用。(參考書[2]6.4)classCRectangle{floatheight,width;public:voidSetHeight(floatx){height=x};voidSetWidth(floaty);voidPrintHeightAndWidth();}; voidinlineCRectangle::SetWidth(floaty){width=y}對于內(nèi)聯(lián)成員函數(shù),編譯時在所有調(diào)用該函數(shù)的地方將裝入實際的函數(shù)代碼。內(nèi)聯(lián)成員函數(shù)的聲明必須出現(xiàn)在對它的每個調(diào)用之前。voidCRectangle::PrintHeightAndWidth(){cout<<“height=“<<height<<endl;cout<<“width=“<<width<<endl;}3.3.4帶缺省參數(shù)的成員函數(shù)類似于一般函數(shù),在類中聲明成員函數(shù)時,可以為成員函數(shù)的參數(shù)指定缺省參數(shù)值。classCRectangle{CRectangle(intWidth=10,intHeight=5);//……};3.3.5對象與成員函數(shù)成員函數(shù)的參數(shù)和返回值不僅可以是整型、字符型、指針類型等,也可以把對象作為參數(shù)和返回值。classCPoint{floatx,y;public:CPoint(floata,floatb);CPointAdd(CPointA); ……}CPoint::CPoint(floata,floatb){ x=a; y=b;}CPointCPoint::Add(CPointA){ CPointB; B.x=x+A.x; B.y=y+A.y; returnB;}3.3.6靜態(tài)數(shù)據(jù)成員和成員函數(shù)1.問題的提出
欲在幾個函數(shù)之間實現(xiàn)數(shù)據(jù)共享,比較可取的方法有兩種:
一是將數(shù)據(jù)存儲在局部變量中,通過參數(shù)傳遞機(jī)制在各個函數(shù)之間共享;
二是將這些函數(shù)和數(shù)據(jù)封裝在一個類中,通過建立該類的對象,使這些函數(shù)操作該類的數(shù)據(jù)成員達(dá)到共享的目的。第二種方法應(yīng)作為首選,其次考慮參數(shù)傳遞,最后還可以考慮使用全局對象。若要在同一個類的多個對象之間共享數(shù)據(jù)該怎么辦?2.靜態(tài)數(shù)據(jù)成員
classCTest {
public:
static
intcount; };
intCTest::count=0;
特點(diǎn):1)用關(guān)鍵字static聲明2)該數(shù)據(jù)成員只有一個拷貝被類的所有對象維護(hù)。3)必須在類中聲明,且作用域也僅限于所屬的類。4)必須象全局變量一樣,在類外定義和初始化。5)程序的其它部分對靜態(tài)數(shù)據(jù)成員的訪問同樣受它在類中聲明的訪問控制的限制。classCTest{
public:
static
intcount;voidSet(intw);voidDisplay();};voidmain(){CTesta,b;a.Set(10);cout<<“Operatingona:”;a.Display();b.Set(10);cout<<“Operatingonb:”;b.Display();cout<<“Operatingona:”;a.Display();return;}運(yùn)行結(jié)果:Operatingona:count=10Operatingonb:count=20Operatingona:count=20intCTest::count=0;voidCTest::Set(intw){count+=w;}voidCTest::Display(){
cout<<“count=“<<count<<endl;}#include
<iostream.h>3.靜態(tài)成員函數(shù)當(dāng)一個函數(shù)只存取靜態(tài)數(shù)據(jù)成員時,這個函數(shù)應(yīng)聲明為靜態(tài)成員函數(shù)。
#include
<iostream.h>classCTest{
public:
static
intcount;voidSet(intw);
staticvoidDisplay();};intCTest::count=0;voidCTest::Set(intw){count+=w;}voidCTest::Display(){
cout<<“count=“<<count<<endl;}voidmain(){CTesta,b;a.Set(10);cout<<“Operatingona:”;
CTest::Display();b.Set(10);cout<<“Operatingonb:”;
CTest::Display();}特點(diǎn):1)類外代碼可以通過類名和作用域操作符來調(diào)用 靜態(tài)成員函數(shù),無需引用類的實例(對象),甚至 類的實例(對象)可以不存在。3.3.7成員函數(shù)重載
除析構(gòu)函數(shù)外,所有成員函數(shù)都可以被重載,只要它們滿足重載函數(shù)時的要求。2)靜態(tài)成員函數(shù)不能直接引用該類的非靜態(tài)數(shù)據(jù)成員或非靜態(tài)成員函數(shù)。因為靜態(tài)成員函數(shù)沒有this指針來存放對象的地址。必須使用 對象名.成員名這種表達(dá)式來引用非靜態(tài)成員。3.4this指針1.問題的提出
當(dāng)一個類的多個對象引用同一個成員函數(shù)時,系統(tǒng)如何確定該引用哪個對象的數(shù)據(jù)成員?2.this指針的特點(diǎn)
每個成員函數(shù)(靜態(tài)成員函數(shù)除外)都有一個this指針變量。
this是一個隱含的指針。
this用于指向以該成員函數(shù)所屬類定義的對象。當(dāng)某個對象調(diào)用成員函數(shù)時,成員函數(shù)的this指針便指向該對象。因此,當(dāng)不同的對象引用同一個成員函數(shù)時,編譯器就依據(jù)成員函數(shù)this指針指向的不同對象來確定引用哪一個對象的數(shù)據(jù)成員。
this關(guān)鍵字只能在成員函數(shù)內(nèi)使用,并且不能被更新。在類X的成員函數(shù)中,this指針的類型為X*const
。3.5const關(guān)鍵字3.5.2
const的特點(diǎn)及使用注意事項3.5.1聲明語法
const是一個類型修飾符,語法是:
Tconst
其中,T是一個類型表達(dá)式。const與T之間的關(guān)系是左結(jié)合的。1.使用const聲明的對象不能被更新。2.由于這種對象不能被更新,因此必須進(jìn)行初始化。
intconsta=2;a=1; //error5.在參數(shù)傳遞時,一個T*類型的對象可以用于const
T*類型的對象可以使用的場合,T&可以用于const
T&可以使用的場合,但反之不成立。3.const
常被用于聲明函數(shù)的形參。指針類型或引用類型的形參使函數(shù)可以更新調(diào)用者中的對象,但若函數(shù)并不更新指針?biāo)赶虻膶ο蠡蛞盟玫膶ο?,那么最好將這樣的參數(shù)使用const關(guān)鍵字進(jìn)行聲明。4.當(dāng)T是一個簡單的類型名時,習(xí)慣上寫作constT。例:constintx=0;類型適應(yīng):一種類型的對象可以用于另一種對象可以使用的場合。7.在類X中聲明的const成員函數(shù)的this指針類型為:
constX*const8.由于const是函數(shù)類型的一個組成部分,因此可被用于參與函數(shù)重載的區(qū)分。
voidPrint()const;//類的常成員函數(shù)
voidPrint();6.對于類中不更新對象的數(shù)據(jù)成員的成員函數(shù),可以將其使用const進(jìn)行聲明。當(dāng)一個成員函數(shù)使用const進(jìn)行聲明后,就表明這個函數(shù)可以操作常對象。沒有使用const關(guān)鍵字進(jìn)行聲明的成員函數(shù)則不能操作常對象。9.由于const對象必須初始化且不能被更新,因此,當(dāng)類中聲明了const數(shù)據(jù)成員時,只能通過成員初始化列表來構(gòu)造該數(shù)據(jù)成員。例:classCExample{
public:CExample(intx);
private:
constinta;};CExample::CExample (intx):a(x){};
在類中聲明靜態(tài)的const數(shù)據(jù)成員時,classA{
private:
static
constintSIZE;}constintA::SIZE=10;3.6友元函數(shù)3.6.1定義
友元函數(shù)是一種特殊的函數(shù),它不是類的成員函數(shù),但允許它訪問類的私有類型數(shù)據(jù)和保護(hù)類型數(shù)據(jù)。3.6.2聲明方式
class
類名稱 //相關(guān)的類
{ typevars; ……
public:
friend
函數(shù)類型函數(shù)名稱(); //聲明友元
…… }
friend
函數(shù)類型函數(shù)名稱() //定義友元
{……}3.6.3特點(diǎn)1.友元可以是一個一般的函數(shù)(友元函數(shù)),也可以是另一個類的成員函數(shù)(友元成員),還可以是整個的一個類(友元類,這時類中的所有成員函數(shù)都是友元函數(shù))。2.友元函數(shù)須在私有成員可被它訪問的類中聲明,而函數(shù)體則在類外聲明。3.友元函數(shù)雖然在類中聲明,但它不是該類的成員函數(shù),而是獨(dú)立于任何類的一般的外界函數(shù),它被允許訪問該類的所有對象的私有成員。4.C++中使用友元是為了提高程序的運(yùn)行效率。但為了確保數(shù)據(jù)的完整性及數(shù)據(jù)封裝與隱藏的原則,應(yīng)盡可能不使用或少使用友元函數(shù)。3.7引用引用是給對象取一個別名,它引入了對象的一個同義詞。error3.7.1定義
定義引用的關(guān)鍵字:T&
例:inti; int&j;int&j=i; j=i;j=6;注意:
(1)引用不產(chǎn)生對象的副本,而是對象的同義詞,它們表示同一個對象。
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025餐飲合作協(xié)議合同
- 2025屋面瓦施工合同
- 2025建設(shè)施工項目預(yù)拌混凝土銷售合同
- 課題申報參考:跨文化主義范式下的19世紀(jì)中法藝術(shù)交流研究
- 歷史地質(zhì)資料對現(xiàn)代山區(qū)橋梁設(shè)計的借鑒價值
- 校園內(nèi)消防安全培訓(xùn)與應(yīng)急救援隊伍建設(shè)
- 如何以醫(yī)療技術(shù)提升患者滿意度與就醫(yī)體驗
- 酒店健康養(yǎng)生主題的營銷活動策劃建議
- 小學(xué)科學(xué)課程中跨學(xué)科學(xué)習(xí)的實施策略
- 【研報】“雙碳”政策持續(xù)發(fā)力綠電主題現(xiàn)投資機(jī)會-興業(yè)證券
- 七上-動點(diǎn)、動角問題12道好題-解析
- 2024年九省聯(lián)考新高考 數(shù)學(xué)試卷(含答案解析)
- 紅色歷史研學(xué)旅行課程設(shè)計
- 下運(yùn)動神經(jīng)元損害綜合征疾病演示課件
- 北師大版三年級數(shù)學(xué)(上冊)看圖列式計算(完整版)
- 2023中考地理真題(含解析)
- 麻醉藥品、精神藥品月檢查記錄表
- 浙江省寧波市海曙區(qū)2022學(xué)年第一學(xué)期九年級期末測試科學(xué)試題卷(含答案和答題卡)
- 高考英語詞匯3500電子版
- 建院新聞社成立策劃書
- JJF 1101-2019環(huán)境試驗設(shè)備溫度、濕度參數(shù)校準(zhǔn)規(guī)范
評論
0/150
提交評論