第7章類(lèi)與對(duì)象_第1頁(yè)
第7章類(lèi)與對(duì)象_第2頁(yè)
第7章類(lèi)與對(duì)象_第3頁(yè)
第7章類(lèi)與對(duì)象_第4頁(yè)
第7章類(lèi)與對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論