版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1第7章類(lèi)與對(duì)象7.1
面向?qū)ο蟮某绦蛟O(shè)計(jì)
面向?qū)ο蟮某绦蛟O(shè)計(jì)的核心是用類(lèi)來(lái)抽象地描述所需解決的某類(lèi)問(wèn)題,用對(duì)象來(lái)代表所要解決的具體問(wèn)題。類(lèi)是一個(gè)概念,即數(shù)據(jù)類(lèi)型;而對(duì)象是實(shí)例,即變量。
編程案例:
現(xiàn)有二個(gè)三角形,需要編程計(jì)算它們的周長(zhǎng)和面積。三角形:
邊長(zhǎng)a;
邊長(zhǎng)b;邊長(zhǎng)c;
周長(zhǎng)l;
面積s。某三角形:
邊長(zhǎng)3;
邊長(zhǎng)4;邊長(zhǎng)5;
周長(zhǎng)12;
面積6。類(lèi):數(shù)據(jù)類(lèi)型對(duì)象:變量第1頁(yè)/共57頁(yè)
面向過(guò)程的程序設(shè)計(jì)方法:
(1)定義函數(shù)fun求三角形的周長(zhǎng)和面積。三角形的邊長(zhǎng)通過(guò)函數(shù)的參數(shù)傳入;
(2)在主函數(shù)中用二組變量分別表示二個(gè)三角形的邊長(zhǎng),并分別調(diào)用函數(shù)fun求得各三角形的周長(zhǎng)和面積。缺點(diǎn):數(shù)據(jù)之間沒(méi)有關(guān)系,數(shù)據(jù)和功能之間沒(méi)有聯(lián)系。
面向?qū)ο蟮某绦蛟O(shè)計(jì)方法:
(1)
定義一個(gè)表示三角形的通用模塊(類(lèi)),描述三角形的數(shù)據(jù)(邊長(zhǎng)、周長(zhǎng)和面積),以及求周長(zhǎng)和面積的方法(函數(shù));
(2)在主函數(shù)中用定義的類(lèi),說(shuō)明二個(gè)變量(對(duì)象),并調(diào)用函數(shù)求三角形的周長(zhǎng)或面積。優(yōu)點(diǎn):對(duì)象之間相對(duì)獨(dú)立;內(nèi)部自成一體,不但包含對(duì)象屬性(數(shù)據(jù)),還包含數(shù)據(jù)的操作(函數(shù))。7.1
面向?qū)ο蟮某绦蛟O(shè)計(jì)第2頁(yè)/共57頁(yè)7.2.1類(lèi)
類(lèi)是對(duì)某一類(lèi)問(wèn)題的抽象的描述。
某一類(lèi)問(wèn)題:在所關(guān)注的問(wèn)題上是通用的;
抽象:只提取必要的信息。類(lèi)定義的基本格式:
class類(lèi)名{
private:
//私有成員
私有成員列表;
protected://保護(hù)成員
保護(hù)成員列表;
public:
//公有成員
公有成員列表;
};7.2
類(lèi)與對(duì)象私有成員只能在類(lèi)中直接訪(fǎng)問(wèn);
保護(hù)成員可以在類(lèi)中,及其派生類(lèi)中直接訪(fǎng)問(wèn);
公有成員允許在任何地方直接訪(fǎng)問(wèn)。設(shè)類(lèi)的對(duì)象t有公有成員a和私有成員b,主函數(shù)中可直接使用t.a,但不能直接用t.b,只能間接訪(fǎng)問(wèn)。類(lèi)的缺省訪(fǎng)問(wèn)特性是私有的,而結(jié)構(gòu)體的缺省訪(fǎng)問(wèn)特性是公有的。第3頁(yè)/共57頁(yè)例7-1
定義一個(gè)求三角形的周長(zhǎng)和面積的類(lèi)TRI。classTRI{floata,b,c;
public:
set(floata1,floatb1,floatc1){a=a1;b=b1;c=c1;}
floatgirth(){return(a+b+c);}
floatarea();
};floatTRI::area()
{
floats,t;
t=girth()/2;
s=sqrt(t*(t-a)*(t-b)*(t-c));
returns;
}7.2.1類(lèi)成員函數(shù)可以在類(lèi)中直接定義,也可以在類(lèi)中說(shuō)明,類(lèi)外定義。類(lèi)外定義時(shí),用類(lèi)名和作用域運(yùn)算符(::)說(shuō)明其所屬的類(lèi)。第4頁(yè)/共57頁(yè)7.2.1類(lèi)類(lèi)定義的幾點(diǎn)說(shuō)明:(1)訪(fǎng)問(wèn)特性關(guān)鍵字出現(xiàn)的順序和次數(shù)均沒(méi)有限制,但同一訪(fǎng)問(wèn)特性成員應(yīng)相對(duì)集中以增加程序的可讀性;(2)與結(jié)構(gòu)體定義相似,不能用關(guān)鍵字auto、register、extern說(shuō)明成員的存儲(chǔ)類(lèi)型,不能初始化數(shù)據(jù)成員;(3)類(lèi)體中直接定義的成員函數(shù)具有內(nèi)聯(lián)特性,類(lèi)中說(shuō)明類(lèi)外定義的成員函數(shù)用inline說(shuō)明才具有內(nèi)聯(lián)特性。(4)類(lèi)成員具有類(lèi)作用域,即類(lèi)的成員類(lèi)中處處可見(jiàn),沒(méi)有先后。
classmyclass{
public: voidf(){cout<<data;}
public: intdata;
};第5頁(yè)/共57頁(yè)對(duì)象
對(duì)象是類(lèi)概念下的實(shí)例。類(lèi)是對(duì)某一類(lèi)問(wèn)題的通用描述,只有對(duì)象才能表示具體的問(wèn)題。類(lèi)與對(duì)象的關(guān)系,類(lèi)似于數(shù)據(jù)類(lèi)型與變量的關(guān)系。1.對(duì)象的定義
定義對(duì)象的方法與定義結(jié)構(gòu)體變量的方法相似,主要有3種:
(1)先定義類(lèi),再定義對(duì)象;
(2)定義類(lèi)的同時(shí),定義對(duì)象;
(3)不列出類(lèi)名,直接定義對(duì)象。2.對(duì)象的使用
類(lèi)體中直接使用類(lèi)的非靜態(tài)成員,類(lèi)體外必須指明成員隸屬的類(lèi)。定義對(duì)象后,通過(guò)對(duì)象名和成員運(yùn)算符“.”使用類(lèi)的公有成員。7.2.2對(duì)象第6頁(yè)/共57頁(yè)例7-2
對(duì)象定義和使用
classA{
inta;
public:
intb;
voidset(intt1,intt2){a=t1;b=t2;}
voidprint(){cout<<a<<','<<b<<endl;}
intgeta(){returna;}
}a1;voidmain()
{Aa2;
a1.set(1,2);a2.set(5,10);a1.print();
cout<<a2.geta()<<',‘<<a2.b<<endl;}7.2.2對(duì)象對(duì)象成員的使用:成員運(yùn)算符,注意成員數(shù)據(jù)與函數(shù)成員的區(qū)別;公有成員和私有成員的操作權(quán)限;對(duì)象成員相對(duì)獨(dú)立,同類(lèi)型對(duì)象賦值。12a1
a
ba2
a
b5
101
2a2=a1;程序輸出為:
1,2
5,10第7頁(yè)/共57頁(yè)例7-3
對(duì)象的指針和引用
classB{
inta,b;
public:
voidset(intt1,intt2){a=t1;b=t2;}
voidprint(){cout<<a<<','<<b<<endl;}
};voidmain()
{Bb1,*p1=&b1,&b2=b1,*p2;
b1.set(5,10);p2=newB;*p2=b1;
b1.print();b2.print();
p1->print();p2->print();
deletep2;}7.2.2對(duì)象對(duì)象的指針、引用和動(dòng)態(tài)對(duì)象;用指針操作對(duì)象成員的形式。程序輸出為:
510
510
510
510第8頁(yè)/共57頁(yè)
程序中聲明一個(gè)對(duì)象時(shí),系統(tǒng)需要根據(jù)其所屬的類(lèi)的結(jié)構(gòu)分配相應(yīng)的內(nèi)存空間;同時(shí)也可以對(duì)該對(duì)象的數(shù)據(jù)成員賦值,即初始化對(duì)象。當(dāng)對(duì)象結(jié)束生命期時(shí),系統(tǒng)需清理內(nèi)存。這兩部分工作由類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)來(lái)完成。7.3.1構(gòu)造函數(shù)
構(gòu)造函數(shù)是類(lèi)中與類(lèi)同名的一組特殊的成員函數(shù)。定義對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用相應(yīng)的構(gòu)造函數(shù),初始化所定義的對(duì)象。構(gòu)造函數(shù)定義的基本格式為:
類(lèi)名(形參列表){初始化數(shù)據(jù)成員語(yǔ)句}構(gòu)造函數(shù)類(lèi)中說(shuō)明,類(lèi)外定義格式為:
(1)類(lèi)中說(shuō)明:類(lèi)名(形參列表);
(2)類(lèi)外定義:類(lèi)名::類(lèi)名(形參列表)
{初始化數(shù)據(jù)成員語(yǔ)句}7.3構(gòu)造函數(shù)與析構(gòu)函數(shù)第9頁(yè)/共57頁(yè)例7-4
構(gòu)造函數(shù)定義和調(diào)用
#include<iostream.h>classC{
inta,b;
public:
voidprint(){cout<<a<<'\t'<<b<<endl;}
};voidmain()
{
c1.print();
}7.3.1構(gòu)造函數(shù)構(gòu)造函數(shù)定義:公有;
造函數(shù)沒(méi)有函數(shù)類(lèi)型,也不是void類(lèi)型;函數(shù)體中不能用return語(yǔ)句返回函數(shù)值。構(gòu)造函數(shù)調(diào)用:自動(dòng)、參數(shù)一致。程序輸出為:
510
主函數(shù)中增加語(yǔ)句:
Cc1;//語(yǔ)法錯(cuò)誤voidset(intt1,intt2){a=t1;b=t2;}Cc1;c1.set(5,10);C(intt1,intt2){a=t1;b=t2;}Cc1(5,10);第10頁(yè)/共57頁(yè)7.3.1構(gòu)造函數(shù)關(guān)于構(gòu)造函數(shù)的定義和使用,需注意以下幾點(diǎn):(1)構(gòu)造函數(shù)中,數(shù)據(jù)成員的初始化可以在函數(shù)體內(nèi)實(shí)現(xiàn),也可以通過(guò)數(shù)據(jù)成員列表的方式實(shí)現(xiàn)。例如,上例中的構(gòu)造函數(shù)可以寫(xiě)成如下形式:
C(intt1,intt2):a(t1),b(t2)
{}(2)在類(lèi)中與類(lèi)同名的成員函數(shù)一定是類(lèi)的構(gòu)造函數(shù)。(3)一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),但必須滿(mǎn)足函數(shù)重載的原則。(4)任何一個(gè)類(lèi)均有構(gòu)造函數(shù),任何一個(gè)對(duì)象生成時(shí)必定要調(diào)用相應(yīng)的構(gòu)造函數(shù)來(lái)初始化其成員。如果類(lèi)中沒(méi)有定義構(gòu)造函數(shù),系統(tǒng)編譯時(shí)會(huì)自動(dòng)產(chǎn)生一個(gè)空的構(gòu)造函數(shù),此時(shí)數(shù)據(jù)成員的值不確定。第11頁(yè)/共57頁(yè)7.3.2
缺省構(gòu)造函數(shù)
缺省的構(gòu)造函數(shù)主要有3種情況:編譯系統(tǒng)自動(dòng)生成的缺省構(gòu)造函數(shù)
用戶(hù)沒(méi)有定義構(gòu)造函數(shù)時(shí),系統(tǒng)自動(dòng)生成的沒(méi)有參數(shù)、函數(shù)體內(nèi)沒(méi)有語(yǔ)句的構(gòu)造函數(shù)。用戶(hù)定義的沒(méi)有參數(shù)的構(gòu)造函數(shù)。用戶(hù)定義的所有參數(shù)都有缺省值的構(gòu)造函數(shù)。定義、使用缺省的構(gòu)造函數(shù)時(shí)注意:編譯系統(tǒng)自動(dòng)生成的缺省構(gòu)造函數(shù)僅用來(lái)生成對(duì)象,而不能初始化對(duì)象;只要用戶(hù)定義了構(gòu)造函數(shù),編譯系統(tǒng)將不再自動(dòng)生成缺省的構(gòu)造函數(shù)
。一個(gè)類(lèi)中,最多有一個(gè)缺省的構(gòu)造函數(shù);但可能沒(méi)有缺省的構(gòu)造函數(shù)。第12頁(yè)/共57頁(yè)例7-5
缺省構(gòu)造函數(shù)定義使用
#include<iostream.h>
classA{
inta;
public:
A(){a=1;}
voidprint(){cout<<a;}
};classB{
inta;
public:
B(intt1){a=t1;}
voidprint(){cout<<a;}
};7.3.2
缺省構(gòu)造函數(shù)
classC{inta;
public:
voidprint(){cout<<a;}
};classD{inta;
public:
D(intt1=3) {a=t1;}
voidprint(){cout<<a;}
};voidmain(){
Aa1;//a1.a=1Bb1;//編譯錯(cuò)誤
Cc1;//c1沒(méi)有初始化
Dd1,d2(5); //d1.a=3,d2.a=5
}A(intt1=1){a=t1;}//?C(){}Bb2();//說(shuō)明無(wú)參函數(shù)b2調(diào)用缺省構(gòu)造函數(shù)建立對(duì)象時(shí),不能給對(duì)象提供參數(shù)。無(wú)法確定調(diào)用哪個(gè)構(gòu)造函數(shù)。第13頁(yè)/共57頁(yè)7.3.3
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù):以對(duì)象的引用作為函數(shù)參數(shù),即用一個(gè)已存在的對(duì)象去初始化一個(gè)新建立的同類(lèi)對(duì)象。主要有二種情況:缺省的拷貝構(gòu)造函數(shù)
在用戶(hù)沒(méi)有定義拷貝構(gòu)造函數(shù)時(shí),系統(tǒng)自動(dòng)生成一個(gè)缺省的拷貝構(gòu)造函數(shù),將用于提供初始數(shù)據(jù)的對(duì)象的成員值依次復(fù)制到新定義的對(duì)象中。用戶(hù)定義的拷貝構(gòu)造函數(shù)
用戶(hù)自定義的、以該類(lèi)對(duì)象引用為參數(shù)的構(gòu)造函數(shù)。當(dāng)用戶(hù)定義了拷貝構(gòu)造函數(shù)時(shí),系統(tǒng)就不再自動(dòng)生成缺省的拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)生成對(duì)象的方式:類(lèi)名
新對(duì)象名(已有對(duì)象名);類(lèi)名
新對(duì)象名=已有對(duì)象名;第14頁(yè)/共57頁(yè)例7-6
拷貝構(gòu)造函數(shù)定義使用
#include<iostream.h>
classA{inta;
public:
A(intt){a=t;}
voidprint(){cout<<a;}
};classB{int*p;
public:
B(intt){p=newint(t);}
voidprint(){cout<<*p;}
voiddel(){deletep;}
};7.3.3
拷貝構(gòu)造函數(shù)
voidmain(){
Aa1(1),a2(a1);
Bb1(5),b2=b1;
a1.print();a2.print();b1.print();b2.print();b1.del();b2.del();
}A(A
&t){a=t.a;}a1.a1a2.a1b1.p5b2.p5B(B
&t)
{p=newint(*t.p);}B(B
&t){p=t.p;}程序輸出為:
11
55
a2.p=a1.p第15頁(yè)/共57頁(yè)7.3.4構(gòu)造函數(shù)與成員初始化列表
當(dāng)類(lèi)的數(shù)據(jù)成員是引用類(lèi)型、常量型或?qū)ο髸r(shí),不能在構(gòu)造函數(shù)體中用賦值語(yǔ)句直接初始化,而應(yīng)以成員列表的形式在函數(shù)頭部完成。使用時(shí)注意:初始化對(duì)象成員的基本形式:
類(lèi)名(形參列表):對(duì)象名(實(shí)參列表)//對(duì)象成員初始化
{普通成員(基本變量)初始化}普通成員也可以在列表中初始化。初始化列表只是提供了相應(yīng)成員的初始化形式和數(shù)據(jù),并沒(méi)有決定各個(gè)成員的初始化順序。列表中成員的初始化順序由類(lèi)定義時(shí)成員的說(shuō)明順序決定。列表中的成員初始化完成后,再執(zhí)行構(gòu)造函數(shù)函數(shù)體,初始化其他成員。第16頁(yè)/共57頁(yè)例7-7對(duì)象成員初始化
#include<iostream.h>
classA{inta;
public:
A(intt){a=t;}
intgeta(){returna;}
};classB{inta,b;
Aa1;intc,d;
public:
B(intt):d(t++),a1(t++),a(t++)
{c=t++;b=t;}
voidprint()
{cout<<a<<b<<c<<d<<a1.geta()<<endl;}
};7.3.4構(gòu)造函數(shù)與成員初始化列表voidmain(){
Bb1(1);b1.print();}程序輸出為:
15432
初始化過(guò)程:
(1)列表中的成員
(2)函數(shù)體
語(yǔ)句順序成員說(shuō)明順序:a→a1→d
:c→b第17頁(yè)/共57頁(yè)7.3.5析構(gòu)函數(shù)
析構(gòu)函數(shù)也是類(lèi)的一種特殊成員函數(shù),執(zhí)行與構(gòu)造函數(shù)相反的操作,用于撤銷(xiāo)對(duì)象時(shí)的清理,如釋放分配給對(duì)象的內(nèi)存空間等。函數(shù)名由析構(gòu)運(yùn)算符“~”和類(lèi)名組成。沒(méi)有函數(shù)類(lèi)型,不能用return返回值。沒(méi)有參數(shù),不能重載。由系統(tǒng)自動(dòng)調(diào)用,調(diào)用順序與構(gòu)造函數(shù)相反。通常無(wú)需定義,系統(tǒng)自動(dòng)生成的缺省析構(gòu)函數(shù)為:
~類(lèi)名(){}
當(dāng)構(gòu)造函數(shù)為類(lèi)的指針成員分配了動(dòng)態(tài)內(nèi)存時(shí),用戶(hù)應(yīng)定義析構(gòu)函數(shù),釋放動(dòng)態(tài)內(nèi)存;此時(shí),系統(tǒng)不再生成缺省的析構(gòu)函數(shù)。第18頁(yè)/共57頁(yè)例7-8析構(gòu)函數(shù)使用
#include<iostream.h>
#include<string.h>
classA{
char*s;public:
A(char*p);
~A();
voidprint(){
cout<<s<<endl;
}
};voidmain()
{Aa1("VisualC++"); a1.print();}7.3.5析構(gòu)函數(shù)A::A(char*p){
s=newchar[strlen(p)+1];
strcpy(s,p);
cout<<"調(diào)用了構(gòu)造函數(shù)\n";
}A::~A(){
delete[]s;
cout<<"調(diào)用了析構(gòu)函數(shù)\n";
}程序輸出為:
調(diào)用了構(gòu)造函數(shù)
VisualC++
調(diào)用了析構(gòu)函數(shù)第19頁(yè)/共57頁(yè)例7-9構(gòu)造函數(shù)與析構(gòu)函數(shù)使用
#include<iostream.h>classA;classB;voidmain(){ Aa1,a2(1),a3(a1); Bb1(2,3),b2;}classA{inta;public: A(intx){a=x;cout<<"構(gòu)造函數(shù)A\n";} A(){a=0;cout<<"缺省構(gòu)造函數(shù)A\n";} A(A&t){a=t.a+10;cout<<"拷貝構(gòu)造函數(shù)A\n";} ~A(){cout<<a<<',';cout<<"釋放A類(lèi)對(duì)象\n";}};7.3.5析構(gòu)函數(shù)程序輸出為:
缺省構(gòu)造函數(shù)A
構(gòu)造函數(shù)A
拷貝構(gòu)造函數(shù)A
構(gòu)造函數(shù)A
構(gòu)造函數(shù)B
缺省構(gòu)造函數(shù)A
缺省構(gòu)造函數(shù)B第20頁(yè)/共57頁(yè)例7-9構(gòu)造函數(shù)與析構(gòu)函數(shù)使用
classB{ intb; Aa1;public: B(intx,inty):a1(x) {b=y;cout<<"構(gòu)造函數(shù)B\n";} B()
{b=5;
cout<<"缺省構(gòu)造函數(shù)B\n";
} ~B()
{cout<<b<<',';
cout<<"釋放B類(lèi)對(duì)象\n";
}};7.3.5析構(gòu)函數(shù)程序輸出為:
5,釋放B類(lèi)對(duì)象
0,釋放A類(lèi)對(duì)象
3,釋放B類(lèi)對(duì)象
2,釋放A類(lèi)對(duì)象
10,釋放A類(lèi)對(duì)象
1,釋放A類(lèi)對(duì)象
0,釋放A類(lèi)對(duì)象第21頁(yè)/共57頁(yè)
類(lèi)的各對(duì)象的數(shù)據(jù)相互獨(dú)立,類(lèi)的成員函數(shù)代碼相同。成員函數(shù)如何區(qū)分其操作的數(shù)據(jù)所屬的對(duì)象?
C++中,類(lèi)的各個(gè)非靜態(tài)成員函數(shù)中都有一個(gè)由系統(tǒng)提供的指針常量this,指向調(diào)用該成員函數(shù)的對(duì)象(當(dāng)前對(duì)象),非靜態(tài)成員函數(shù)中的成員均被隱含地施加了this指針,即類(lèi)中缺省引用的非靜態(tài)成員是this指針?biāo)赶虻某蓡T。如:
voidA::print(){cout<<a;}
即voidA::print(){cout<<this->a;}通常情況下,this指針由系統(tǒng)自動(dòng)隱含使用。特定情況下,用戶(hù)必須顯式地使用this指針。7.4
this指針第22頁(yè)/共57頁(yè)例7-10this使用
#include<iostream.h>
classA{
inta,b;
public:
A(inta,intt)
{this->a=a;b=t;}Aadd(A&t)
{a=a+t.a;
b=b+t.b;
return*this;
}voidprint()
{cout<<a<<'\t'<<b<<endl;}
};7.4this指針voidmain()
{Aa1(1,2),a2(5,10);
a1.print();a2.print();a2=a1.add(a2);a1.print();a2.print();
}成員函數(shù)中直接使用的成員,通常等同于this->成員。程序輸出為:
12
510
612
612this->a=this->a+t.a;根據(jù)局部?jī)?yōu)先原則,參數(shù)a。第23頁(yè)/共57頁(yè)
同一個(gè)類(lèi)的不同對(duì)象之間的普通成員是相互獨(dú)立的,即可以有不同的數(shù)據(jù)。而靜態(tài)成員則可實(shí)現(xiàn)不同對(duì)象之間的數(shù)據(jù)和函數(shù)共享。在類(lèi)的定義中,用關(guān)鍵字static說(shuō)明的成員為靜態(tài)成員,分靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。7.5.1靜態(tài)數(shù)據(jù)成員
類(lèi)的靜態(tài)數(shù)據(jù)成員不屬于特定對(duì)象,而屬于類(lèi);必須在類(lèi)中說(shuō)明的同時(shí),在類(lèi)外定義;改變了一個(gè)對(duì)象靜態(tài)數(shù)據(jù)成員的值,則所有其他對(duì)象的相應(yīng)靜態(tài)數(shù)據(jù)成員的值均隨之改變。7.5
靜態(tài)成員A::ba24aa11a0classA{public:inta;staticintb,c;
A(intx,inty,intz){a=x;b=y;c=z;}};
intA::b,A::c=10;
Aa1(1,2,3),a2(4,5,6);A::c102356第24頁(yè)/共57頁(yè)例7-11類(lèi)的靜態(tài)數(shù)據(jù)成員的定義與使用
#include<iostream.h>
classA{
inta;
staticintb,c;public:
A(intt){a=t;}voidadd()
{a++;b++;c++;}
voidprint()
{cout<<a<<'\t';
cout<<b<<'\t'<<A::c<<endl;
}
};intA::b,A::c=5;7.5.1靜態(tài)數(shù)據(jù)成員voidmain(){Aa1(0),a2(3);a1.print();a2.print();a1.add(); a1.print();a2.print();}靜態(tài)數(shù)據(jù)成員缺省初值為0;類(lèi)中引用性說(shuō)明格式為:
static數(shù)據(jù)類(lèi)型成員名;類(lèi)外定義格式為:
數(shù)據(jù)類(lèi)型類(lèi)名::成員名(初值);
數(shù)據(jù)類(lèi)型類(lèi)名::成員名=初值;程序輸出為:
005
305
116
316第25頁(yè)/共57頁(yè)
在類(lèi)體中用關(guān)鍵字static修飾的函數(shù)稱(chēng)為類(lèi)的靜態(tài)成員函數(shù)。靜態(tài)成員同樣為該類(lèi)的所有對(duì)象所共有,不屬于某個(gè)特定的對(duì)象,函數(shù)內(nèi)部沒(méi)有this指針。靜態(tài)成員函數(shù)可以類(lèi)體中說(shuō)明,類(lèi)體外定義。類(lèi)體中說(shuō)明時(shí)必須用static修飾,類(lèi)體外定義時(shí)不能用static修飾。靜態(tài)成員函數(shù)中訪(fǎng)問(wèn)成員
只能直接訪(fǎng)問(wèn)類(lèi)的靜態(tài)成員,等同于類(lèi)名::靜態(tài)成員;間接訪(fǎng)問(wèn)類(lèi)的非靜態(tài)成員,等同于類(lèi)外訪(fǎng)問(wèn),即對(duì)象.非靜態(tài)成員。普通函數(shù)中訪(fǎng)問(wèn)靜態(tài)成員
(1)
非靜態(tài)成員函數(shù):通過(guò)this指針,或“類(lèi)名::”訪(fǎng)問(wèn)。
(2)
外部函數(shù):可以指明其所屬的對(duì)象(對(duì)象.靜態(tài)成員),也可以指明其所屬的類(lèi)(類(lèi)名::靜態(tài)成員)。7.5.2靜態(tài)成員函數(shù)第26頁(yè)/共57頁(yè)例7-12類(lèi)的靜態(tài)成員函數(shù)的定義與使用
#include<iostream.h>
classS{
inta;staticintb;public:
S(intt){a=t;}
staticvoidadd1()
{b++;//等同于S::b++
a++;//等同于this->a++,錯(cuò)誤!
}
staticvoidadd2(St);
voidprint(){cout<<a<<'\t'<<b<<endl;}
};intS::b=5;
voidS::add2(St){t.a++;b++;}7.5靜態(tài)成員voidmain(){S::add1();//指明所屬類(lèi)
Ss1(0);s1.print();s1.add2(s1);//指明所屬對(duì)象
s1.print();}刪除錯(cuò)誤行后,程序輸出為:
06
07通過(guò)this訪(fǎng)問(wèn)靜態(tài)成員也可通過(guò)類(lèi)名::訪(fǎng)問(wèn),即S::b第27頁(yè)/共57頁(yè)7.6
常對(duì)象與常成員
用關(guān)鍵字const修飾類(lèi)的成員或?qū)ο?,在程序運(yùn)行期間是不可改變的,稱(chēng)為常成員或常對(duì)象。1.常數(shù)據(jù)成員在類(lèi)中說(shuō)明時(shí)加關(guān)鍵字const的數(shù)據(jù)成員。除靜態(tài)常數(shù)據(jù)成員以外,類(lèi)的常數(shù)據(jù)成員只能在類(lèi)的構(gòu)造函數(shù)中通過(guò)初始化列表的方式初始化,不能通過(guò)賦值的形式初始化。類(lèi)的靜態(tài)常數(shù)據(jù)成員只能在類(lèi)外定義時(shí)初始化。常數(shù)據(jù)成員只能被讀取,不能被修改。第28頁(yè)/共57頁(yè)例7-13常成員數(shù)據(jù)的定義與使用
#include<iostream.h>
classT{
inta;
intconstb;//常成員,constintb;
constint&c;
//常成員引用
conststaticintd;
//靜態(tài)常成員public:
T(intt1,intt2):b(t2),c(a)
{a=t1;}voidprint(){cout<<a<<b<<c<<d<<endl;}
voidfun(){a++;}//不可改變b、c、d
};constintT::d=15; voidmain(){Tt1(5,10);t1.print();t1.fun();t1.print();}程序輸出為:
510515
6106157.6
常對(duì)象與常成員非常數(shù)據(jù)成員不可以引用常數(shù)據(jù)成員,常數(shù)據(jù)成員可以引用非常數(shù)據(jù)成員第29頁(yè)/共57頁(yè)7.6
常對(duì)象與常成員2.常成員函數(shù)
用關(guān)鍵const說(shuō)明的成員函數(shù)稱(chēng)為常成員函數(shù):
函數(shù)類(lèi)型函數(shù)名(形參表表)const;關(guān)鍵字const加在函數(shù)頭部的最后,而不是加在最前面。如果加在最前面,則表示函數(shù)的類(lèi)型是一個(gè)常量。關(guān)鍵字const是函數(shù)類(lèi)型的一個(gè)組成部分,原型說(shuō)明時(shí)不可省略。常成員函數(shù)不能修改本類(lèi)的數(shù)據(jù)成員,也不能調(diào)用其他非常成員函數(shù)。關(guān)鍵字const作為函數(shù)重載時(shí)區(qū)分不同函數(shù)的標(biāo)志。重載的原則是:常對(duì)象調(diào)用常成員函數(shù),一般對(duì)象調(diào)用一般成員函數(shù)。第30頁(yè)/共57頁(yè)7.6
常對(duì)象與常成員3.常對(duì)象
定義時(shí)通過(guò)const修飾的對(duì)象為常對(duì)象,其定義形式如下:
類(lèi)名const
對(duì)象名;
或:
const
類(lèi)名對(duì)象名;常對(duì)象定義時(shí)必須初始化;常對(duì)象的數(shù)據(jù)成員不允許被改變;通過(guò)常對(duì)象,只能調(diào)用類(lèi)的常成員函數(shù)。非常對(duì)象,既可以調(diào)用非常成員函數(shù),也可以調(diào)用常成員函數(shù)。第31頁(yè)/共57頁(yè)例7-14常成員函數(shù)與常對(duì)象使用
#include<iostream.h>
classA{
inta;
intconstb;
public:
A(intt1,intt2):b(t1)
{a=t2;}
voidprint()const;voidprint(){cout<<a-b<<endl;}
voidadd(intt){a+=t;}
};voidA::print()const
{cout<<a+b<<endl; } voidmain(){constAa1(5,10);Aa2(1,2); a1.add(3);//編譯錯(cuò)誤
a2.add(3);a1.print();a2.print();}程序輸出為:
15
47.6
常對(duì)象與常成員常對(duì)象只能引用常成員第32頁(yè)/共57頁(yè)例7-15根據(jù)鍵盤(pán)輸入的身份證號(hào)計(jì)算相應(yīng)的年齡。程序設(shè)計(jì)從身份證號(hào)碼中提取出生年份,并與當(dāng)前年份相減即可得到年齡。從身份證號(hào)碼中提取出生年份的方法是把身份證號(hào)碼作為一個(gè)字符串,然后把指定位置(從第7位到第10位)的數(shù)字字符轉(zhuǎn)換為一個(gè)整數(shù)。當(dāng)前年份可以通過(guò)調(diào)用C++庫(kù)函數(shù)time來(lái)獲取。函數(shù)time返回time_t格式的系統(tǒng)當(dāng)前日期,然后調(diào)用庫(kù)函數(shù)localtime將其轉(zhuǎn)換為一個(gè)tm類(lèi)型的結(jié)構(gòu)體變量,其中成員tm_year中存放以1900年為起點(diǎn)的年份數(shù)。類(lèi)型time_t和結(jié)構(gòu)體tm都在系統(tǒng)文件time.h中定義。7.7程序設(shè)計(jì)舉例第33頁(yè)/共57頁(yè)
源程序代碼
#include<iostream.h>#include<time.h>#include<string.h>classID{
charid[20];
//
身份證號(hào)
intage;
//
年齡public:
ID(char*id){strcpy(this->id,id);}
intval(char*p,inti,intj);//從身份證中提取出生日期
voidfun();//計(jì)算年齡
voiddisplay()
{ cout<<"身份證號(hào):"<<id<<endl; cout<<"年齡:"<<age<<endl;
}};7.7程序設(shè)計(jì)舉例voidmain(){chars[20];cout<<"請(qǐng)輸入身份證號(hào):";cin>>s;IDid(s);id.fun();id.display();}第34頁(yè)/共57頁(yè)
源程序代碼
intID::val(char*p,inti,intj){
//從身份證中提取出生日期
//將字符串從第i個(gè)字符開(kāi)始的j個(gè)連續(xù)數(shù)字轉(zhuǎn)換為一個(gè)整數(shù)
intn=0,k=i+j;
while(i<k){ n=n*10+*(p+i)-'0';
i++;
}
return(n);}7.7程序設(shè)計(jì)舉例voidID::fun() //計(jì)算年齡{intyear=val(id,6,4);
//以下2行獲取當(dāng)前時(shí)間,并存入tm類(lèi)型的結(jié)構(gòu)體變量t中
time_ttimer;timer=time(0);tmt=*localtime(&timer);age=t.tm_year+1900-year;}第35頁(yè)/共57頁(yè)例7-16定義一個(gè)數(shù)組類(lèi),實(shí)現(xiàn)將二維數(shù)組各行元素排序、各列元素排序、全體元素按內(nèi)存順序排序等功能。程序設(shè)計(jì)
classArray{
inta[4][5];
public:
Array(intt[][5]);
voidprint();
voidfun1(); //行排序
voidfun2(); //列排序
voidfun3(); //內(nèi)存順序排序
};7.7程序設(shè)計(jì)舉例第36頁(yè)/共57頁(yè)程序設(shè)計(jì)voidmain(){intdata[4][5]={…};Arraya1(data),a2(data);cout<<"\n原數(shù)組:\n";a1.print();cout<<"\n行排序:\n";a1.fun1();a1.print();cout<<"\n列排序:\n";a1=a2;a1.fun2();a1.print();cout<<"\n內(nèi)存順序排序:\n";a1=a2;a1.fun3(); a1.print();}7.7程序設(shè)計(jì)舉例第37頁(yè)/共57頁(yè)例7-17定義一個(gè)類(lèi),將一組數(shù)組按給定的行列表示成一個(gè)二維數(shù)組。程序設(shè)計(jì)
classArray{
int*p;
//指針成員表示一組數(shù)組
intm,n;
//m、n分別為二維護(hù)數(shù)組的行數(shù)和列數(shù)
public:
Array(int*t,inta,intb);
~Array()
{
delete[]p;
}
//撤銷(xiāo)動(dòng)態(tài)內(nèi)存
intget(inti,intj);//取數(shù)組下標(biāo)為[i][j]的元素
voidprint();
};voidmain()
{constinti0=3,j0=5;intdata[i0*j0]={…};
Arraya1(data,i0,j0);a1.print();
}7.7程序設(shè)計(jì)舉例第38頁(yè)/共57頁(yè)例7-18定義一個(gè)將學(xué)生類(lèi),將一組學(xué)生的數(shù)據(jù)存入對(duì)象數(shù)組,并根據(jù)成績(jī)學(xué)生信息排序。要求每個(gè)同學(xué)的信息中均含有該班成績(jī)的總分和平均分。程序設(shè)計(jì)
classSTU;//表示一個(gè)學(xué)生的類(lèi)
voidinput(STUt[]);
voidsort(STU*p[]);
voidprint(STU*t[]);
voidmain()
{
STU*p[5],s[5];
input(s);
for(inti=0;i<STU::get_count();i++)p[i]=s+i;
sort(p);
print(p);
}7.7程序設(shè)計(jì)舉例第39頁(yè)/共57頁(yè)程序設(shè)計(jì)
classSTU{
floatscore;
charname[15];
staticintcount;
staticfloatsum,average;
public:
STU(){
count++;
}
~STU(){
count--;}
voidinput();
voidprint(){
cout<<name<<":"<<score<<endl;
}
staticintget_count(){
returncount;
}
staticfloatget_sum()
{
returnsum;
}
staticfloatget_average(){
returnaverage;
}
floatget_score()
{
returnscore;
}
};7.7程序設(shè)計(jì)舉例第40頁(yè)/共57頁(yè)程序結(jié)構(gòu)
面向?qū)ο蟮木幊逃袃刹糠纸M成:
(1)類(lèi)的定義;
(2)類(lèi)的測(cè)試
主函數(shù)中用定義的類(lèi)說(shuō)明對(duì)象,然后通過(guò)對(duì)象調(diào)用有關(guān)的成員函數(shù)。構(gòu)造函數(shù)
用形參初始化數(shù)據(jù)成員。根據(jù)數(shù)據(jù)成員,分3種情況:
(1)普通變量作成員;
(2)數(shù)組作成員;
(3)指針作成員。析構(gòu)函數(shù)
釋放構(gòu)造函數(shù)中分配的動(dòng)態(tài)空間,只有數(shù)據(jù)成員為第3種情況時(shí)才需定義。7.7程序設(shè)計(jì)舉例第41頁(yè)/共57頁(yè)輸出函數(shù)
根據(jù)要求,按3種數(shù)據(jù)成員采用適當(dāng)?shù)姆椒ㄝ敵鰯?shù)據(jù)成員。功能函數(shù)
完成題目提出的操作要求,如排序、取字符串中的數(shù)字、調(diào)整元素(行列)位置等。測(cè)試程序(主函數(shù))
(1)定義對(duì)象時(shí)注意
類(lèi)的數(shù)據(jù)成員為非字符數(shù)組時(shí),對(duì)象的參數(shù)只能是與形參對(duì)應(yīng)的數(shù)組名;而數(shù)據(jù)成員為字符數(shù)組時(shí),對(duì)象的參數(shù)除了數(shù)組名外,還可以是字符串常量。
(2)調(diào)用成員函數(shù)時(shí)注意
調(diào)用語(yǔ)句基本格式為:對(duì)象.成員函數(shù)(實(shí)參);
注意成員函數(shù)調(diào)用的順序和參數(shù)。7.7程序設(shè)計(jì)舉例第42頁(yè)/共57頁(yè)數(shù)據(jù)成員為普通變量
構(gòu)造函數(shù)中直接把實(shí)參賦給數(shù)據(jù)成員。數(shù)據(jù)成員為一維數(shù)組
構(gòu)造函數(shù)的形參為指針變量(一維數(shù)組)和整型變量(數(shù)組大?。?,函數(shù)體中通過(guò)循環(huán)語(yǔ)句把形參賦給數(shù)據(jù)成員,其他功能函數(shù)體中通過(guò)循環(huán)語(yǔ)句操作一維數(shù)組。數(shù)據(jù)成員為字符數(shù)組
構(gòu)造函數(shù)的形參為指針變量(字符數(shù)組),通過(guò)字符串處理函數(shù)(賦值)、循環(huán)語(yǔ)句等方法操作字符數(shù)組。數(shù)據(jù)成員為二維數(shù)組
構(gòu)造函數(shù)的形參為行指針(二維數(shù)組)和整型變量(二維數(shù)組行數(shù)),通過(guò)二層循環(huán)語(yǔ)句操作二維數(shù)組。7.7程序設(shè)計(jì)舉例第43頁(yè)/共57頁(yè)數(shù)據(jù)成員為指針變量用new為指針變量分配動(dòng)態(tài)空間;分配動(dòng)態(tài)空間后,指針變量等同于數(shù)組。然后用操作數(shù)組的方法操作指針變量所指指動(dòng)態(tài)動(dòng)態(tài)空間,注意指針變量所指位置,盡可能不要移動(dòng)。如:
classmycalass{
int*p,num;
char*str;
public:
myclass(inta[],intn,char*s)
{num=n;p=newint[num];
for(inti=0;i<num;i++)p[i]=a[i];
str=newchar[strlen(s)+1];strcpy(str,s);
}7.7程序設(shè)計(jì)舉例第44頁(yè)/共57頁(yè)1.試定義一個(gè)類(lèi)STR,將字符串中的數(shù)字字符依次全部移到字符串的后半部。具體要求如下:
(1)私有數(shù)據(jù)成員char*p;p為待處理的字符串。
(2)公有成員函數(shù)STR(char*s);構(gòu)造函數(shù),用s初始化數(shù)據(jù)成員p。voidmove(char&t1,char&t2);交換兩個(gè)字符的位置。voidfun();根據(jù)題意處理字符串p。算法要求:從左到右依次對(duì)字符串p的每個(gè)字符進(jìn)行檢測(cè),如果在數(shù)字字符的右側(cè)有非數(shù)字字符,則通過(guò)調(diào)用函數(shù)move()將該非數(shù)字字符與前一個(gè)字符進(jìn)行交換,直到前一個(gè)字符為非數(shù)字字符為止。~STR();析構(gòu)函數(shù),撤銷(xiāo)所占用的動(dòng)態(tài)存儲(chǔ)空間。voidprint();輸出數(shù)組中的所有元素。
(3)在主函數(shù)中對(duì)類(lèi)STR進(jìn)行測(cè)試。7.8習(xí)題第45頁(yè)/共57頁(yè)7.8習(xí)題voidSTR::fun(){for(char*p1=p;*p1;p1++){if(*p1>'9'&&*p1<'0')continue;char*p2=p1;while(*p2>='0'&&*p2<='9')p2++;if(!(*p2))break;while(*p2&&p2>p1){move(*p2,*(p2-1));p2--;}}}voidmain()
{STRt(“12AS353hjk56”);
t.print();t.fun();t.print();
}#include<iostream.h>#include<string.hclassSTR{char*ppublic:STR(char*s){p=newchar[strlen(s)+1];strcpy(p,s);}voidfun();voidmove(char&t1,char&t2){chart=t1;t1=t2;t2=t;}voidprint(){cout<<p<<endl;}~STR(){delete[]p; }};第46頁(yè)/共57頁(yè)2.試定義一個(gè)類(lèi)Array,將二維數(shù)組的各列依次循環(huán)右移n次。具體要求如下:
(1)私有數(shù)據(jù)成員inta[4][4];待處理的數(shù)組。
(2)公有成員函數(shù)Array(intt[][4],intn);構(gòu)造函數(shù),用數(shù)組t初始化數(shù)組a,n表示數(shù)組的行數(shù)。voidright();將數(shù)組a各列循環(huán)右移1次,其中,數(shù)組的最右一列移至數(shù)組的最左邊。voidrmove(intn);利用成員函數(shù)rig
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《磨床操作知識(shí)》課件
- 工業(yè)機(jī)器人模擬題含參考答案
- 養(yǎng)老院老人生活?yuàn)蕵?lè)活動(dòng)組織人員管理制度
- 養(yǎng)老院老人家屬溝通聯(lián)系制度
- 《離散PID控制器》課件
- 2024年水電工程綠化養(yǎng)護(hù)合同范本3篇
- 授權(quán)委托書(shū)保證協(xié)議書(shū)(2篇)
- 《人力資源考核手冊(cè)》課件
- 2025年齊齊哈爾貨運(yùn)從業(yè)資格仿真考題
- 2025年宣城道路貨運(yùn)駕駛員從業(yè)資格證考試題庫(kù)完整
- 東南大學(xué)高數(shù)實(shí)驗(yàn)報(bào)告
- 地基與基礎(chǔ)工程試題及參考答案
- 新能源汽車(chē)專(zhuān)業(yè)畢業(yè)論文
- 部編版六年級(jí)上冊(cè)語(yǔ)文期末古詩(shī)文專(zhuān)項(xiàng)訓(xùn)練(含答案)
- GB/T 29465-2023浮頭式熱交換器用法蘭
- 鋼渣的綜合利用
- 少年宮乒乓球興趣小組簡(jiǎn)介
- 西醫(yī)癥狀鑒別診斷全部
- 靜脈輸液流程圖
- 國(guó)開(kāi)電大本科《管理英語(yǔ)4》機(jī)考真題(第八套)
- DB5114T+51-2023東坡菜+干拌雞烹飪工藝技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論