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

下載本文檔

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

文檔簡介

會計學1第7章類與對象7.1

面向?qū)ο蟮某绦蛟O(shè)計

面向?qū)ο蟮某绦蛟O(shè)計的核心是用類來抽象地描述所需解決的某類問題,用對象來代表所要解決的具體問題。類是一個概念,即數(shù)據(jù)類型;而對象是實例,即變量。

編程案例:

現(xiàn)有二個三角形,需要編程計算它們的周長和面積。三角形:

邊長a;

邊長b;邊長c;

周長l;

面積s。某三角形:

邊長3;

邊長4;邊長5;

周長12;

面積6。類:數(shù)據(jù)類型對象:變量第1頁/共57頁

面向過程的程序設(shè)計方法:

(1)定義函數(shù)fun求三角形的周長和面積。三角形的邊長通過函數(shù)的參數(shù)傳入;

(2)在主函數(shù)中用二組變量分別表示二個三角形的邊長,并分別調(diào)用函數(shù)fun求得各三角形的周長和面積。缺點:數(shù)據(jù)之間沒有關(guān)系,數(shù)據(jù)和功能之間沒有聯(lián)系。

面向?qū)ο蟮某绦蛟O(shè)計方法:

(1)

定義一個表示三角形的通用模塊(類),描述三角形的數(shù)據(jù)(邊長、周長和面積),以及求周長和面積的方法(函數(shù));

(2)在主函數(shù)中用定義的類,說明二個變量(對象),并調(diào)用函數(shù)求三角形的周長或面積。優(yōu)點:對象之間相對獨立;內(nèi)部自成一體,不但包含對象屬性(數(shù)據(jù)),還包含數(shù)據(jù)的操作(函數(shù))。7.1

面向?qū)ο蟮某绦蛟O(shè)計第2頁/共57頁7.2.1類

類是對某一類問題的抽象的描述。

某一類問題:在所關(guān)注的問題上是通用的;

抽象:只提取必要的信息。類定義的基本格式:

class類名{

private:

//私有成員

私有成員列表;

protected://保護成員

保護成員列表;

public:

//公有成員

公有成員列表;

};7.2

類與對象私有成員只能在類中直接訪問;

保護成員可以在類中,及其派生類中直接訪問;

公有成員允許在任何地方直接訪問。設(shè)類的對象t有公有成員a和私有成員b,主函數(shù)中可直接使用t.a,但不能直接用t.b,只能間接訪問。類的缺省訪問特性是私有的,而結(jié)構(gòu)體的缺省訪問特性是公有的。第3頁/共57頁例7-1

定義一個求三角形的周長和面積的類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類成員函數(shù)可以在類中直接定義,也可以在類中說明,類外定義。類外定義時,用類名和作用域運算符(::)說明其所屬的類。第4頁/共57頁7.2.1類類定義的幾點說明:(1)訪問特性關(guān)鍵字出現(xiàn)的順序和次數(shù)均沒有限制,但同一訪問特性成員應相對集中以增加程序的可讀性;(2)與結(jié)構(gòu)體定義相似,不能用關(guān)鍵字auto、register、extern說明成員的存儲類型,不能初始化數(shù)據(jù)成員;(3)類體中直接定義的成員函數(shù)具有內(nèi)聯(lián)特性,類中說明類外定義的成員函數(shù)用inline說明才具有內(nèi)聯(lián)特性。(4)類成員具有類作用域,即類的成員類中處處可見,沒有先后。

classmyclass{

public: voidf(){cout<<data;}

public: intdata;

};第5頁/共57頁對象

對象是類概念下的實例。類是對某一類問題的通用描述,只有對象才能表示具體的問題。類與對象的關(guān)系,類似于數(shù)據(jù)類型與變量的關(guān)系。1.對象的定義

定義對象的方法與定義結(jié)構(gòu)體變量的方法相似,主要有3種:

(1)先定義類,再定義對象;

(2)定義類的同時,定義對象;

(3)不列出類名,直接定義對象。2.對象的使用

類體中直接使用類的非靜態(tài)成員,類體外必須指明成員隸屬的類。定義對象后,通過對象名和成員運算符“.”使用類的公有成員。7.2.2對象第6頁/共57頁例7-2

對象定義和使用

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對象對象成員的使用:成員運算符,注意成員數(shù)據(jù)與函數(shù)成員的區(qū)別;公有成員和私有成員的操作權(quán)限;對象成員相對獨立,同類型對象賦值。12a1

a

ba2

a

b5

101

2a2=a1;程序輸出為:

1,2

5,10第7頁/共57頁例7-3

對象的指針和引用

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對象對象的指針、引用和動態(tài)對象;用指針操作對象成員的形式。程序輸出為:

510

510

510

510第8頁/共57頁

程序中聲明一個對象時,系統(tǒng)需要根據(jù)其所屬的類的結(jié)構(gòu)分配相應的內(nèi)存空間;同時也可以對該對象的數(shù)據(jù)成員賦值,即初始化對象。當對象結(jié)束生命期時,系統(tǒng)需清理內(nèi)存。這兩部分工作由類的構(gòu)造函數(shù)和析構(gòu)函數(shù)來完成。7.3.1構(gòu)造函數(shù)

構(gòu)造函數(shù)是類中與類同名的一組特殊的成員函數(shù)。定義對象時,系統(tǒng)自動調(diào)用相應的構(gòu)造函數(shù),初始化所定義的對象。構(gòu)造函數(shù)定義的基本格式為:

類名(形參列表){初始化數(shù)據(jù)成員語句}構(gòu)造函數(shù)類中說明,類外定義格式為:

(1)類中說明:類名(形參列表);

(2)類外定義:類名::類名(形參列表)

{初始化數(shù)據(jù)成員語句}7.3構(gòu)造函數(shù)與析構(gòu)函數(shù)第9頁/共57頁例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ù)沒有函數(shù)類型,也不是void類型;函數(shù)體中不能用return語句返回函數(shù)值。構(gòu)造函數(shù)調(diào)用:自動、參數(shù)一致。程序輸出為:

510

主函數(shù)中增加語句:

Cc1;//語法錯誤voidset(intt1,intt2){a=t1;b=t2;}Cc1;c1.set(5,10);C(intt1,intt2){a=t1;b=t2;}Cc1(5,10);第10頁/共57頁7.3.1構(gòu)造函數(shù)關(guān)于構(gòu)造函數(shù)的定義和使用,需注意以下幾點:(1)構(gòu)造函數(shù)中,數(shù)據(jù)成員的初始化可以在函數(shù)體內(nèi)實現(xiàn),也可以通過數(shù)據(jù)成員列表的方式實現(xiàn)。例如,上例中的構(gòu)造函數(shù)可以寫成如下形式:

C(intt1,intt2):a(t1),b(t2)

{}(2)在類中與類同名的成員函數(shù)一定是類的構(gòu)造函數(shù)。(3)一個類可以有多個構(gòu)造函數(shù),但必須滿足函數(shù)重載的原則。(4)任何一個類均有構(gòu)造函數(shù),任何一個對象生成時必定要調(diào)用相應的構(gòu)造函數(shù)來初始化其成員。如果類中沒有定義構(gòu)造函數(shù),系統(tǒng)編譯時會自動產(chǎn)生一個空的構(gòu)造函數(shù),此時數(shù)據(jù)成員的值不確定。第11頁/共57頁7.3.2

缺省構(gòu)造函數(shù)

缺省的構(gòu)造函數(shù)主要有3種情況:編譯系統(tǒng)自動生成的缺省構(gòu)造函數(shù)

用戶沒有定義構(gòu)造函數(shù)時,系統(tǒng)自動生成的沒有參數(shù)、函數(shù)體內(nèi)沒有語句的構(gòu)造函數(shù)。用戶定義的沒有參數(shù)的構(gòu)造函數(shù)。用戶定義的所有參數(shù)都有缺省值的構(gòu)造函數(shù)。定義、使用缺省的構(gòu)造函數(shù)時注意:編譯系統(tǒng)自動生成的缺省構(gòu)造函數(shù)僅用來生成對象,而不能初始化對象;只要用戶定義了構(gòu)造函數(shù),編譯系統(tǒng)將不再自動生成缺省的構(gòu)造函數(shù)

。一個類中,最多有一個缺省的構(gòu)造函數(shù);但可能沒有缺省的構(gòu)造函數(shù)。第12頁/共57頁例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;//編譯錯誤

Cc1;//c1沒有初始化

Dd1,d2(5); //d1.a=3,d2.a=5

}A(intt1=1){a=t1;}//?C(){}Bb2();//說明無參函數(shù)b2調(diào)用缺省構(gòu)造函數(shù)建立對象時,不能給對象提供參數(shù)。無法確定調(diào)用哪個構(gòu)造函數(shù)。第13頁/共57頁7.3.3

拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù):以對象的引用作為函數(shù)參數(shù),即用一個已存在的對象去初始化一個新建立的同類對象。主要有二種情況:缺省的拷貝構(gòu)造函數(shù)

在用戶沒有定義拷貝構(gòu)造函數(shù)時,系統(tǒng)自動生成一個缺省的拷貝構(gòu)造函數(shù),將用于提供初始數(shù)據(jù)的對象的成員值依次復制到新定義的對象中。用戶定義的拷貝構(gòu)造函數(shù)

用戶自定義的、以該類對象引用為參數(shù)的構(gòu)造函數(shù)。當用戶定義了拷貝構(gòu)造函數(shù)時,系統(tǒng)就不再自動生成缺省的拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)生成對象的方式:類名

新對象名(已有對象名);類名

新對象名=已有對象名;第14頁/共57頁例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頁/共57頁7.3.4構(gòu)造函數(shù)與成員初始化列表

當類的數(shù)據(jù)成員是引用類型、常量型或?qū)ο髸r,不能在構(gòu)造函數(shù)體中用賦值語句直接初始化,而應以成員列表的形式在函數(shù)頭部完成。使用時注意:初始化對象成員的基本形式:

類名(形參列表):對象名(實參列表)//對象成員初始化

{普通成員(基本變量)初始化}普通成員也可以在列表中初始化。初始化列表只是提供了相應成員的初始化形式和數(shù)據(jù),并沒有決定各個成員的初始化順序。列表中成員的初始化順序由類定義時成員的說明順序決定。列表中的成員初始化完成后,再執(zhí)行構(gòu)造函數(shù)函數(shù)體,初始化其他成員。第16頁/共57頁例7-7對象成員初始化

#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

初始化過程:

(1)列表中的成員

(2)函數(shù)體

語句順序成員說明順序:a→a1→d

:c→b第17頁/共57頁7.3.5析構(gòu)函數(shù)

析構(gòu)函數(shù)也是類的一種特殊成員函數(shù),執(zhí)行與構(gòu)造函數(shù)相反的操作,用于撤銷對象時的清理,如釋放分配給對象的內(nèi)存空間等。函數(shù)名由析構(gòu)運算符“~”和類名組成。沒有函數(shù)類型,不能用return返回值。沒有參數(shù),不能重載。由系統(tǒng)自動調(diào)用,調(diào)用順序與構(gòu)造函數(shù)相反。通常無需定義,系統(tǒng)自動生成的缺省析構(gòu)函數(shù)為:

~類名(){}

當構(gòu)造函數(shù)為類的指針成員分配了動態(tài)內(nèi)存時,用戶應定義析構(gòu)函數(shù),釋放動態(tài)內(nèi)存;此時,系統(tǒng)不再生成缺省的析構(gòu)函數(shù)。第18頁/共57頁例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頁/共57頁例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類對象\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頁/共57頁例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類對象\n";

}};7.3.5析構(gòu)函數(shù)程序輸出為:

5,釋放B類對象

0,釋放A類對象

3,釋放B類對象

2,釋放A類對象

10,釋放A類對象

1,釋放A類對象

0,釋放A類對象第21頁/共57頁

類的各對象的數(shù)據(jù)相互獨立,類的成員函數(shù)代碼相同。成員函數(shù)如何區(qū)分其操作的數(shù)據(jù)所屬的對象?

C++中,類的各個非靜態(tài)成員函數(shù)中都有一個由系統(tǒng)提供的指針常量this,指向調(diào)用該成員函數(shù)的對象(當前對象),非靜態(tài)成員函數(shù)中的成員均被隱含地施加了this指針,即類中缺省引用的非靜態(tài)成員是this指針所指向的成員。如:

voidA::print(){cout<<a;}

即voidA::print(){cout<<this->a;}通常情況下,this指針由系統(tǒng)自動隱含使用。特定情況下,用戶必須顯式地使用this指針。7.4

this指針第22頁/共57頁例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ù)局部優(yōu)先原則,參數(shù)a。第23頁/共57頁

同一個類的不同對象之間的普通成員是相互獨立的,即可以有不同的數(shù)據(jù)。而靜態(tài)成員則可實現(xiàn)不同對象之間的數(shù)據(jù)和函數(shù)共享。在類的定義中,用關(guān)鍵字static說明的成員為靜態(tài)成員,分靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。7.5.1靜態(tài)數(shù)據(jù)成員

類的靜態(tài)數(shù)據(jù)成員不屬于特定對象,而屬于類;必須在類中說明的同時,在類外定義;改變了一個對象靜態(tài)數(shù)據(jù)成員的值,則所有其他對象的相應靜態(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頁/共57頁例7-11類的靜態(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;類中引用性說明格式為:

static數(shù)據(jù)類型成員名;類外定義格式為:

數(shù)據(jù)類型類名::成員名(初值);

數(shù)據(jù)類型類名::成員名=初值;程序輸出為:

005

305

116

316第25頁/共57頁

在類體中用關(guān)鍵字static修飾的函數(shù)稱為類的靜態(tài)成員函數(shù)。靜態(tài)成員同樣為該類的所有對象所共有,不屬于某個特定的對象,函數(shù)內(nèi)部沒有this指針。靜態(tài)成員函數(shù)可以類體中說明,類體外定義。類體中說明時必須用static修飾,類體外定義時不能用static修飾。靜態(tài)成員函數(shù)中訪問成員

只能直接訪問類的靜態(tài)成員,等同于類名::靜態(tài)成員;間接訪問類的非靜態(tài)成員,等同于類外訪問,即對象.非靜態(tài)成員。普通函數(shù)中訪問靜態(tài)成員

(1)

非靜態(tài)成員函數(shù):通過this指針,或“類名::”訪問。

(2)

外部函數(shù):可以指明其所屬的對象(對象.靜態(tài)成員),也可以指明其所屬的類(類名::靜態(tài)成員)。7.5.2靜態(tài)成員函數(shù)第26頁/共57頁例7-12類的靜態(tài)成員函數(shù)的定義與使用

#include<iostream.h>

classS{

inta;staticintb;public:

S(intt){a=t;}

staticvoidadd1()

{b++;//等同于S::b++

a++;//等同于this->a++,錯誤!

}

staticvoidadd2(St);

voidprint(){cout<<a<<'\t'<<b<<endl;}

};intS::b=5;

voidS::add2(St){t.a++;b++;}7.5靜態(tài)成員voidmain(){S::add1();//指明所屬類

Ss1(0);s1.print();s1.add2(s1);//指明所屬對象

s1.print();}刪除錯誤行后,程序輸出為:

06

07通過this訪問靜態(tài)成員也可通過類名::訪問,即S::b第27頁/共57頁7.6

常對象與常成員

用關(guān)鍵字const修飾類的成員或?qū)ο?,在程序運行期間是不可改變的,稱為常成員或常對象。1.常數(shù)據(jù)成員在類中說明時加關(guān)鍵字const的數(shù)據(jù)成員。除靜態(tài)常數(shù)據(jù)成員以外,類的常數(shù)據(jù)成員只能在類的構(gòu)造函數(shù)中通過初始化列表的方式初始化,不能通過賦值的形式初始化。類的靜態(tài)常數(shù)據(jù)成員只能在類外定義時初始化。常數(shù)據(jù)成員只能被讀取,不能被修改。第28頁/共57頁例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

常對象與常成員非常數(shù)據(jù)成員不可以引用常數(shù)據(jù)成員,常數(shù)據(jù)成員可以引用非常數(shù)據(jù)成員第29頁/共57頁7.6

常對象與常成員2.常成員函數(shù)

用關(guān)鍵const說明的成員函數(shù)稱為常成員函數(shù):

函數(shù)類型函數(shù)名(形參表表)const;關(guān)鍵字const加在函數(shù)頭部的最后,而不是加在最前面。如果加在最前面,則表示函數(shù)的類型是一個常量。關(guān)鍵字const是函數(shù)類型的一個組成部分,原型說明時不可省略。常成員函數(shù)不能修改本類的數(shù)據(jù)成員,也不能調(diào)用其他非常成員函數(shù)。關(guān)鍵字const作為函數(shù)重載時區(qū)分不同函數(shù)的標志。重載的原則是:常對象調(diào)用常成員函數(shù),一般對象調(diào)用一般成員函數(shù)。第30頁/共57頁7.6

常對象與常成員3.常對象

定義時通過const修飾的對象為常對象,其定義形式如下:

類名const

對象名;

或:

const

類名對象名;常對象定義時必須初始化;常對象的數(shù)據(jù)成員不允許被改變;通過常對象,只能調(diào)用類的常成員函數(shù)。非常對象,既可以調(diào)用非常成員函數(shù),也可以調(diào)用常成員函數(shù)。第31頁/共57頁例7-14常成員函數(shù)與常對象使用

#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);//編譯錯誤

a2.add(3);a1.print();a2.print();}程序輸出為:

15

47.6

常對象與常成員常對象只能引用常成員第32頁/共57頁例7-15根據(jù)鍵盤輸入的身份證號計算相應的年齡。程序設(shè)計從身份證號碼中提取出生年份,并與當前年份相減即可得到年齡。從身份證號碼中提取出生年份的方法是把身份證號碼作為一個字符串,然后把指定位置(從第7位到第10位)的數(shù)字字符轉(zhuǎn)換為一個整數(shù)。當前年份可以通過調(diào)用C++庫函數(shù)time來獲取。函數(shù)time返回time_t格式的系統(tǒng)當前日期,然后調(diào)用庫函數(shù)localtime將其轉(zhuǎn)換為一個tm類型的結(jié)構(gòu)體變量,其中成員tm_year中存放以1900年為起點的年份數(shù)。類型time_t和結(jié)構(gòu)體tm都在系統(tǒng)文件time.h中定義。7.7程序設(shè)計舉例第33頁/共57頁

源程序代碼

#include<iostream.h>#include<time.h>#include<string.h>classID{

charid[20];

//

身份證號

intage;

//

年齡public:

ID(char*id){strcpy(this->id,id);}

intval(char*p,inti,intj);//從身份證中提取出生日期

voidfun();//計算年齡

voiddisplay()

{ cout<<"身份證號:"<<id<<endl; cout<<"年齡:"<<age<<endl;

}};7.7程序設(shè)計舉例voidmain(){chars[20];cout<<"請輸入身份證號:";cin>>s;IDid(s);id.fun();id.display();}第34頁/共57頁

源程序代碼

intID::val(char*p,inti,intj){

//從身份證中提取出生日期

//將字符串從第i個字符開始的j個連續(xù)數(shù)字轉(zhuǎn)換為一個整數(shù)

intn=0,k=i+j;

while(i<k){ n=n*10+*(p+i)-'0';

i++;

}

return(n);}7.7程序設(shè)計舉例voidID::fun() //計算年齡{intyear=val(id,6,4);

//以下2行獲取當前時間,并存入tm類型的結(jié)構(gòu)體變量t中

time_ttimer;timer=time(0);tmt=*localtime(&timer);age=t.tm_year+1900-year;}第35頁/共57頁例7-16定義一個數(shù)組類,實現(xiàn)將二維數(shù)組各行元素排序、各列元素排序、全體元素按內(nèi)存順序排序等功能。程序設(shè)計

classArray{

inta[4][5];

public:

Array(intt[][5]);

voidprint();

voidfun1(); //行排序

voidfun2(); //列排序

voidfun3(); //內(nèi)存順序排序

};7.7程序設(shè)計舉例第36頁/共57頁程序設(shè)計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è)計舉例第37頁/共57頁例7-17定義一個類,將一組數(shù)組按給定的行列表示成一個二維數(shù)組。程序設(shè)計

classArray{

int*p;

//指針成員表示一組數(shù)組

intm,n;

//m、n分別為二維護數(shù)組的行數(shù)和列數(shù)

public:

Array(int*t,inta,intb);

~Array()

{

delete[]p;

}

//撤銷動態(tài)內(nèi)存

intget(inti,intj);//取數(shù)組下標為[i][j]的元素

voidprint();

};voidmain()

{constinti0=3,j0=5;intdata[i0*j0]={…};

Arraya1(data,i0,j0);a1.print();

}7.7程序設(shè)計舉例第38頁/共57頁例7-18定義一個將學生類,將一組學生的數(shù)據(jù)存入對象數(shù)組,并根據(jù)成績學生信息排序。要求每個同學的信息中均含有該班成績的總分和平均分。程序設(shè)計

classSTU;//表示一個學生的類

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è)計舉例第39頁/共57頁程序設(shè)計

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è)計舉例第40頁/共57頁程序結(jié)構(gòu)

面向?qū)ο蟮木幊逃袃刹糠纸M成:

(1)類的定義;

(2)類的測試

主函數(shù)中用定義的類說明對象,然后通過對象調(diào)用有關(guān)的成員函數(shù)。構(gòu)造函數(shù)

用形參初始化數(shù)據(jù)成員。根據(jù)數(shù)據(jù)成員,分3種情況:

(1)普通變量作成員;

(2)數(shù)組作成員;

(3)指針作成員。析構(gòu)函數(shù)

釋放構(gòu)造函數(shù)中分配的動態(tài)空間,只有數(shù)據(jù)成員為第3種情況時才需定義。7.7程序設(shè)計舉例第41頁/共57頁輸出函數(shù)

根據(jù)要求,按3種數(shù)據(jù)成員采用適當?shù)姆椒ㄝ敵鰯?shù)據(jù)成員。功能函數(shù)

完成題目提出的操作要求,如排序、取字符串中的數(shù)字、調(diào)整元素(行列)位置等。測試程序(主函數(shù))

(1)定義對象時注意

類的數(shù)據(jù)成員為非字符數(shù)組時,對象的參數(shù)只能是與形參對應的數(shù)組名;而數(shù)據(jù)成員為字符數(shù)組時,對象的參數(shù)除了數(shù)組名外,還可以是字符串常量。

(2)調(diào)用成員函數(shù)時注意

調(diào)用語句基本格式為:對象.成員函數(shù)(實參);

注意成員函數(shù)調(diào)用的順序和參數(shù)。7.7程序設(shè)計舉例第42頁/共57頁數(shù)據(jù)成員為普通變量

構(gòu)造函數(shù)中直接把實參賦給數(shù)據(jù)成員。數(shù)據(jù)成員為一維數(shù)組

構(gòu)造函數(shù)的形參為指針變量(一維數(shù)組)和整型變量(數(shù)組大小),函數(shù)體中通過循環(huán)語句把形參賦給數(shù)據(jù)成員,其他功能函數(shù)體中通過循環(huán)語句操作一維數(shù)組。數(shù)據(jù)成員為字符數(shù)組

構(gòu)造函數(shù)的形參為指針變量(字符數(shù)組),通過字符串處理函數(shù)(賦值)、循環(huán)語句等方法操作字符數(shù)組。數(shù)據(jù)成員為二維數(shù)組

構(gòu)造函數(shù)的形參為行指針(二維數(shù)組)和整型變量(二維數(shù)組行數(shù)),通過二層循環(huán)語句操作二維數(shù)組。7.7程序設(shè)計舉例第43頁/共57頁數(shù)據(jù)成員為指針變量用new為指針變量分配動態(tài)空間;分配動態(tài)空間后,指針變量等同于數(shù)組。然后用操作數(shù)組的方法操作指針變量所指指動態(tài)動態(tài)空間,注意指針變量所指位置,盡可能不要移動。如:

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è)計舉例第44頁/共57頁1.試定義一個類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);交換兩個字符的位置。voidfun();根據(jù)題意處理字符串p。算法要求:從左到右依次對字符串p的每個字符進行檢測,如果在數(shù)字字符的右側(cè)有非數(shù)字字符,則通過調(diào)用函數(shù)move()將該非數(shù)字字符與前一個字符進行交換,直到前一個字符為非數(shù)字字符為止。~STR();析構(gòu)函數(shù),撤銷所占用的動態(tài)存儲空間。voidprint();輸出數(shù)組中的所有元素。

(3)在主函數(shù)中對類STR進行測試。7.8習題第45頁/共57頁7.8習題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頁/共57頁2.試定義一個類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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論