《C++程序設(shè)計(jì)基礎(chǔ)》-陸勤-電子教案-2941 第九章 對(duì)象與類_第1頁(yè)
《C++程序設(shè)計(jì)基礎(chǔ)》-陸勤-電子教案-2941 第九章 對(duì)象與類_第2頁(yè)
《C++程序設(shè)計(jì)基礎(chǔ)》-陸勤-電子教案-2941 第九章 對(duì)象與類_第3頁(yè)
《C++程序設(shè)計(jì)基礎(chǔ)》-陸勤-電子教案-2941 第九章 對(duì)象與類_第4頁(yè)
《C++程序設(shè)計(jì)基礎(chǔ)》-陸勤-電子教案-2941 第九章 對(duì)象與類_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

第九章 對(duì)象與類19.1

從結(jié)構(gòu)化程序設(shè)計(jì)到面向?qū)ο蟪绦蛟O(shè)計(jì)2許多項(xiàng)目都接近或達(dá)到了結(jié)構(gòu)化方法所不能處理的限度,為解決這一問題,就產(chǎn)生了面向?qū)ο蟮某绦蛟O(shè)計(jì)(Object-Oriented

Programming,簡(jiǎn)稱

OOP)方法。面向過程:程序設(shè)計(jì)=數(shù)據(jù)結(jié)構(gòu)+算法面向?qū)ο螅撼绦蛟O(shè)計(jì)=(數(shù)據(jù)結(jié)構(gòu)+算法)3程序設(shè)計(jì)范型(Paradigm)是指設(shè)計(jì)程序的規(guī)范、模型和風(fēng)格。不同的范型有不同的程序設(shè)計(jì)技術(shù)和方法學(xué)。過程程序設(shè)計(jì)范型:程序=過程+調(diào)用面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)范型(封裝、繼承、多態(tài))程序=對(duì)象+消息4面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)范型的主要特點(diǎn):程序基本元素是對(duì)象——由類創(chuàng)建。程序結(jié)構(gòu)由類的定義和類的使用兩部分組成。一切操作都通過向?qū)ο蟀l(fā)送相應(yīng)的消息來實(shí)現(xiàn)。類可自定義,但應(yīng)盡量使用現(xiàn)成的類。類定義部分C++程序(聲明和實(shí)現(xiàn))類使用部分(主函數(shù)及子函數(shù))9.2

面向?qū)ο蟪绦蚪Y(jié)構(gòu)及優(yōu)點(diǎn)56面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn):控制程序的復(fù)雜性增強(qiáng)程序的模塊性提高程序的重用性改善程序的可維護(hù)性能對(duì)現(xiàn)實(shí)世界的分類系統(tǒng)進(jìn)行自然的描述很好地適應(yīng)新的硬件環(huán)境7類的定義格式一般如下:class<類名>{

private:<數(shù)據(jù)成員><成員函數(shù)>protected:<數(shù)據(jù)成員><成員函數(shù)>public:<數(shù)據(jù)成員><成員函數(shù)>

};9.3

類與對(duì)象的定義8訪問權(quán)限關(guān)鍵字特性:

private:私有部分。只能由本類的成員函數(shù)訪問,不允許外界直接訪問它,即私有成員對(duì)外是完全隱蔽的。

protected:保護(hù)部分??梢杂杀绢惖某蓡T函數(shù)訪問也可由本類的公有派生類的成員函數(shù)訪問,但不允許外界直接訪問它,即它是半隱蔽的。

public:公有部分。可由程序中的任何函數(shù)(包括類內(nèi)和類外)訪問。9說明:

三個(gè)部分并非一定要全有,但至少要有其中的一個(gè)部分。

若私有部分處于類體中第一部分時(shí),關(guān)鍵字

private可以省略。

private、protected、public的次序和出現(xiàn)的次數(shù)可以是任意的。10例4

類date定義和對(duì)象today說明示例class

date

{public:void

setdate(int,int,int);//

設(shè)置月日年成員函數(shù)int

isleapyear(date);

//

判是否閏年成員函數(shù)int

howmanydays(date);//確定是該年第幾天成員函數(shù)private://月,數(shù)據(jù)成員//日,數(shù)據(jù)成員//年,數(shù)據(jù)成員int

month;int

day;int

year;};date

today;11類的成員函數(shù)在類體內(nèi)定義成員函數(shù)的格式如下:<返回類型><函數(shù)名>([<參數(shù)表>]){<函數(shù)體>}12在類體外定義成員函數(shù)的格式如下:<返回類型><類名>::<函數(shù)名>([<參數(shù)表>]){<函數(shù)體>}//域解析符”::”13

類的成員函數(shù)的定義可包含在類的定義中。類內(nèi)的函數(shù)是內(nèi)聯(lián)函數(shù)。

只有那些非常簡(jiǎn)單的函數(shù)才在類聲明中直接定義。

一般在類體中僅給出函數(shù)原型,而把函數(shù)體的定義放在類體外實(shí)現(xiàn)。

類的數(shù)據(jù)成員為該類的全體對(duì)象所共有,類的成員函數(shù)為該類的全體對(duì)象所共享。14例

學(xué)生類的定義class

Student{private:int

number;float

score;public:void

input(int

number1,float

score1);void

modify(float

score1);void

print();

};

//.h文件15void

Student::input(int

number1,float

score1){

number=number1;score=score1;

}void

Student::modify(float

score1){score=score1;

}void

Student::print(){cout<<

"

\nnumber:

"<<numter<<“score:”<<score;}//.cpp文件16僅含函數(shù)原型的類聲明部分稱為類的界面部分;類中成員函數(shù)的定義部分稱為類的實(shí)現(xiàn)部分;類的界面部分一般存放在擴(kuò)展名為h的文件中;類的實(shí)現(xiàn)部分則存放于擴(kuò)展名為cpp文件中;

在.cpp文件的開頭要用include將.h文件包含在其中。179.4

構(gòu)造函數(shù)和析構(gòu)函數(shù)專門用于對(duì)象自動(dòng)生成和自動(dòng)撤消的兩個(gè)成員函數(shù),稱為構(gòu)造函數(shù)和析構(gòu)函數(shù)。1.構(gòu)造函數(shù)特點(diǎn):函數(shù)名與其所屬類名相同,但無任何返回類型。例如,我們可給Student類定義構(gòu)造函數(shù)如下:

Student::Student(int

number1,float

score1){

number=number1;score=score1;

}18在聲明一個(gè)類變量時(shí),系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)對(duì)變量進(jìn)行初始化,而生成對(duì)象。例如:

Studenta(10,90);

//創(chuàng)建了對(duì)象a構(gòu)造函數(shù)可以重載??梢越oStudent類再定義一個(gè)構(gòu)造函數(shù):Student::Student(){

number=0;score=0;

}Studentb;//創(chuàng)建了對(duì)象b,其兩個(gè)數(shù)據(jù)成員的值都是0。19利用構(gòu)造函數(shù)直接創(chuàng)建對(duì)象的一般語法形式為:<類名>

<對(duì)象名>

[

(

<實(shí)參表>

)

]

;利用構(gòu)造函數(shù)創(chuàng)建對(duì)象的第二種方法是:<類名>

*<指針>

=

new

<類名>[(<實(shí)參表>]

;例如:Student

*pa=new

Student(10,90);20例9定義complex的復(fù)數(shù)類,以執(zhí)行有關(guān)復(fù)數(shù)和、差、積等。在類定義中包含構(gòu)造函數(shù),每當(dāng)創(chuàng)建一個(gè)復(fù)數(shù)對(duì)象時(shí),通過該構(gòu)造函數(shù)對(duì)復(fù)數(shù)對(duì)象初始化,即令其實(shí)部與虛部均為0。#include<iostream>using

namespace

std;class

complex{public:complex(int=0,int=0);void

setcomp(int,int);void

addcomp(complex,complex);void

subcomp(complex,complex);void

mulcomp(complex,complex);void

printcomp(

);private:

int

real;

int

imag;

};imag=z1.real*z2.imag+z2.real*z1.imag;}21complex::complex(int

re,int

im){setcomp(re,im);

}void

complex::setcomp(int

re,int

im){real=re;

imag=im;

}void

complex::addcomp(complex

z1,complex

z2){real=z1.real+z2.real;imag=z1.imag+z2.imag;

}void

complex::subcomp(complex

z1,complex

z2){real=z1.real-z2.real;imag=z1.imag-z2.imag;

}void

complex::mulcomp(complex

z1,complex

z2){real=z1.real*z2.real-z1.imag*z2.imag;void

complex::printcomp(

){cout<<”(”<<real<<”,”<<imag<<”)”;

}void

main(

){complex

z1,z2(5),z;z.addcomp(z1,z2);z1.printcomp(

);cout<<”+”;z2.printcomp(

);cout<<”=”;z.printcomp(

);

cout<<endl;z1.setcomp(8,9);z2.setcomp(2,10);z.subcomp(z1,z2);

z1.printcomp(

);cout<<”-”;z2.printcomp(

);cout<<”=”;z.printcomp(

);cout<<endl;z.mulcomp(z1,z2);

z1.printcomp(

);cout<<”*”;z2.printcomp(

);cout<<”=”;z.printcomp(

);cout<<endl;

}2223運(yùn)行示例(0,0)+(5,0)=(5,0)(8,9)-(2,10)=(6,-1)(8,9)*(2,10)=(-74,98)24強(qiáng)調(diào)

在程序中無需也無法直接調(diào)用某類的構(gòu)造函數(shù)。某類的構(gòu)造函數(shù)在創(chuàng)建該類的對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用。

不允許在類定義中說明類的數(shù)據(jù)成員時(shí)直接進(jìn)行初始化。以下的類定義是不正確的:class

complex{……private:int

real=0;//錯(cuò)誤!int

imag=0;//錯(cuò)誤!};252.析構(gòu)函數(shù)析構(gòu)函數(shù)與所屬類同名,定義時(shí)不能指定任何返回類型,但析構(gòu)函數(shù)的函數(shù)名前要有一個(gè)”~”號(hào),函數(shù)名后有一對(duì)圓括號(hào),且其中無參數(shù),函數(shù)體內(nèi)一般僅由delete

p;形的刪除語句組成,其中p為構(gòu)造函數(shù)中指向由

new所開辟的內(nèi)存空間的指針。26與類的構(gòu)造函數(shù)相同的是,類的析構(gòu)函數(shù)不帶 有函數(shù)類型標(biāo)識(shí)符,即不返回任何函數(shù)值。與類的構(gòu)造函數(shù)不同的是,類的析構(gòu)函數(shù)不接 受任何參數(shù)。一個(gè)類定義中只能定義一個(gè)析構(gòu)函數(shù),也就是 說,類的析構(gòu)函數(shù)不能重載。但是,卻允許定 義多個(gè)重載構(gòu)造函數(shù)。27例10程序在類complex定義中包含一個(gè)不執(zhí)行任何附加操作的析構(gòu)函數(shù)定義,另外,所有類的公有成員函數(shù)包括構(gòu)造函數(shù)、析構(gòu)函數(shù)均在類定義內(nèi)給出完整定義。#include<iostream>using

namespace

std;class

complex{public:complex(int

re=0,int

im=0)

{

setcomp(re,im);

}void

setcomp(int

re,int

im)

{

real=re;imag=im;

}void

addcomp(complex

z1,complex

z2){real=z1.real+z2.real;imag=z1.imag+z2.imag;

}void

subcomp(complex

z1,complex

z2){real=z1.real-z2.real;imag=z1.imag-z2.imag;

}28void

mulcomp(complex

z1,complexz2){real=z1.real*z2.real-z1.imag*z2.imag;imag=z1.real*z2.imag+z2.real*z1.imag;

}void

printcomp(

){

cout<<”(”<<real<<”,”<<imag<<”)”;

}~complex(

)

{

}private:int

real;int

imag;};29void

main(

){complex

z1,z2(5),z3,z4,z5(4,15),z6(11,5),z;z.addcomp(z1,z2);z1.printcomp(

);cout<<”+”;z2.printcomp(

);cout<<”=”;z.printcomp(

);cout<<endl;z3.setcomp(8,9);z4.setcomp(2,10);z.subcomp(z3,z4);z3.printcomp(

);cout<<”-”;z4.printcomp(

);cout<<”=”;z.printcomp(

);cout<<endl;z.mulcomp(z5,z6);z5.printcomp(

);cout<<”*”;z6.printcomp(

);cout<<”=”;z.printcomp(

);cout<<endl;

}30運(yùn)行示例(0,0)+(5,0)=(5,0)(8,9)-(2,10)=(6,-1)(4,15)*(11,5)=(-31,185)31構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用順序類的構(gòu)造函數(shù)在類的對(duì)象說明時(shí)即創(chuàng)建時(shí)自動(dòng)調(diào)用。類的析構(gòu)函數(shù)在類的對(duì)象撤消時(shí)即退出其作用域范圍 時(shí)自動(dòng)調(diào)用。調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù)的順序取決于創(chuàng)建和撤消類 的對(duì)象的順序。類的析構(gòu)函數(shù)的調(diào)用順序與類的構(gòu)造函數(shù)的調(diào)用順序 正好相反。32例11

程序演示了類exam的諸對(duì)象在不同作用域中創(chuàng)建與撤消時(shí)其構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序。在類exam的定義中,還定義了重載構(gòu)造函數(shù)。#include<iostream>using

namespace

std;class

exam{

public:exam(

){

num=1;cout<<”i”<<num<<”:constructor”<<endl;

}exam(int

i)

{

num=i;cout<<”i”<<num<<”:constructor”<<endl;

}~exam(

){

cout<<”i”<<num<<”:destructor”<<endl;

}private:

int

num;

};33void

func(

){

cout<<”Enter

func.”<<endl;exam

i4(4);cout<<”Exit

func.”<<endl;}void

main(

){

cout<<”Enter

main.”<<endl;exam

i1,i2(2),i3(3);func(

);func(

);cout<<”Exit

main.”<<endl;}34運(yùn)行示例

Enter

main.i1:constructori2:constructori3:constructorEnter

func.i4:constructorExit

func.i4:destructorEnter

func.i4:constructorExit

func.i4:destructorExitmain.i3:destructori2:destructori1:destructor35可見,對(duì)于在普通函數(shù)定義中的對(duì)象說明,由于它是局部對(duì)象,因此,當(dāng)多次調(diào)用該函數(shù)時(shí),每次對(duì)該函數(shù)的調(diào)用,該對(duì)象均將創(chuàng)建與撤消,故構(gòu)造函數(shù)及析構(gòu)函數(shù)將不止一次地被調(diào)用。36運(yùn)算符重載是指將標(biāo)準(zhǔn)的、內(nèi)部定義的運(yùn)算符在類中 重新定義,以改變運(yùn)算符的原有含義及功能,使其可 擴(kuò)展至能執(zhí)行對(duì)類的對(duì)象進(jìn)行操作。在類中,將運(yùn)算符定義成重載函數(shù)的形式,稱為運(yùn)算 符重載函數(shù)。重新定義的重載運(yùn)算符可應(yīng)用于實(shí)現(xiàn)抽象數(shù)據(jù)類型, 諸如復(fù)數(shù)類、集合類、棧類等等,從而擴(kuò)展了C面向 對(duì)象程序設(shè)計(jì)的實(shí)現(xiàn)能力。9.6

用成員函數(shù)重載運(yùn)算符37運(yùn)算符重載時(shí)應(yīng)遵循的一些規(guī)則:運(yùn)算符重載機(jī)制可用來改變C語言所提供大多數(shù)標(biāo)準(zhǔn)的、內(nèi)部預(yù)定義運(yùn)算符的含義。一個(gè)被重載的運(yùn)算符,就是一個(gè)用戶自定義的運(yùn)算符重載函數(shù)。運(yùn)算符重載只能應(yīng)用于類的對(duì)象。只能重載現(xiàn)有的內(nèi)部預(yù)定義運(yùn)算符。C++語言所提供內(nèi)部預(yù)定義運(yùn)算符中的大多數(shù)(而非全部)可用于運(yùn)算符重載。運(yùn)算符重載不能改變內(nèi)部預(yù)定義運(yùn)算符原有的優(yōu)先級(jí)及結(jié)合性。必須遵循與特定運(yùn)算符相聯(lián)系的句法格式。38實(shí)現(xiàn)運(yùn)算符重載的函數(shù)定義形式在C程序中,可使用如下三種不同的運(yùn)算符重載函數(shù)定義形式進(jìn)行運(yùn)算符重載:用類的成員函數(shù)進(jìn)行運(yùn)算符重載。用頂層函數(shù)進(jìn)行運(yùn)算符重載。用類的友元函數(shù)進(jìn)行運(yùn)算符重載。39用成員函數(shù)重載運(yùn)算符的一般格式為:<返回類型>operator<運(yùn)算符>([<參數(shù)表>]){<定義體>}其中,operator是函數(shù)的關(guān)鍵字。一元運(yùn)算符則參數(shù)表為空,

二元運(yùn)算符,則參數(shù)表中只有一個(gè)操作對(duì)象,這個(gè)操作對(duì)象代表右操作數(shù),左操作數(shù)則由

this指針傳給該函數(shù)。

this指針是構(gòu)成運(yùn)算符重載這一機(jī)制所必須的組成部分。40這種重載運(yùn)算符函數(shù)的語義可表示為<對(duì)象>.operator<一元運(yùn)算符>()或<對(duì)象1>.operator<二元運(yùn)算符,<對(duì)象2>)前者可解釋為給當(dāng)前對(duì)象發(fā)送一個(gè)進(jìn)行某一元運(yùn)算的消息;

后者可解釋為給當(dāng)前對(duì)象1發(fā)送一個(gè)與對(duì)象2進(jìn)行某二元運(yùn)算的消息。

這兩種語義表示形式也可作為重載后的相應(yīng)運(yùn)算符的使用形式(下面的友員函數(shù)重載運(yùn)算符也一樣)。但一般情況下人們還是沿用運(yùn)算符通常的簡(jiǎn)潔表示形式。41例

成員函數(shù)重載運(yùn)算符#include<iostream.h>class

Vector{int

X,y;public:Vector();//定義一個(gè)二維向量類Vector

(int

x1,int

y1);void

print();Vector

operator++(int);//在該類中重載一元運(yùn)算符++Vector

operator+(Vector

v);//在該類中重載二元運(yùn)算符十};42Vector::Vector(){x=0;y=0;}Vector::Vector(int

x1,int

y1){x=x1;y=y1;}void

Vector::print(){

cout<<"\n("<<x<<","<<y<<")";}Vector

Vector::operator++(int){

x++;y++;return

*this;

}Vector

Vectoc::operator十(Vector

v){

Vector

v0;v0.x=x+v.x;//這里的x相當(dāng)于this->x,即左操作數(shù)的數(shù)據(jù)成員43v0·y=y+v.y;//這里的y相當(dāng)于this-)y,即左操作數(shù)的數(shù)據(jù)成員

return

v0;}main(){

Vector

v1(10,10);v1.print();Vector

v11;v11=v1++;v1.print();v11.print();Vector

v2(20,20);//測(cè)試程序44(v1+v2).Print();Vector

v3;v3=v1+v2;v3.print();v3++·print();return

0

;}C++約定:對(duì)于前綴方式(++i)括號(hào)中為空;對(duì)于后綴方式(i--)括號(hào)中填寫符號(hào)”int”?!こ绦虻倪\(yùn)行結(jié)果為·

(10,10)·

(11,11)·

(11,11)·

(31,31)·

(31,31)·

(32,32)459.7

使用類的友元函數(shù)進(jìn)行運(yùn)算符重載關(guān)于類的友元函數(shù),有下列使用規(guī)則:類的友元函數(shù)不是類的成員,但它應(yīng)在類中定義,在類的外部實(shí)現(xiàn)。在類中定義友元函數(shù)時(shí),函數(shù)名前應(yīng)前置關(guān)鍵字

friend,而在類的外部實(shí)現(xiàn)友元函數(shù)時(shí),省略關(guān)鍵字

friend。類的友元函數(shù)可訪問類的公有成員、私有成員和保護(hù)成員。this指針不能用于類的友元函數(shù),它僅能用于類的成員函數(shù)。46友員函數(shù)重載運(yùn)算符的一般格式為:friend

<返回類型>operator

<運(yùn)算符>

([<參數(shù)表>]){<定義體>}其中,一元運(yùn)算符參數(shù)表中只有一個(gè)操作對(duì)象;

二元運(yùn)算符參數(shù)表中需要兩個(gè)操作對(duì)象,它們分別代表左、右操作數(shù)。47這種重載運(yùn)算符函數(shù)的語義可表示為:

operator<一元運(yùn)算符>(<對(duì)象>)或operator<二元運(yùn)算符>(<對(duì)象1,對(duì)象2>)前者表示:對(duì)當(dāng)前對(duì)象進(jìn)行某一元運(yùn)算;后者表示:對(duì)當(dāng)前對(duì)象1和對(duì)象2施行某二元運(yùn)算。例

用友員函數(shù)重載運(yùn)算符class

Vector{public:friend

Vector

operator十(Vector

v1,Vectorv2);};48Vector

operator+(Vector

v1,Vector

v2){Vector

v0;v0.x=v1.x+v2.x:Vo.y=v1.y+v2.y;return

v0;

}main(){

Vector

v1(10,10);

Vector

v2(20,20);

Vector

v3;v3=v1十v2;v3.print();reyurn

0;

}·程序運(yùn)行結(jié)果為:·

(30,30)499.8類模板與模板類C++語言利用模板機(jī)制為類定義類模板(即設(shè)置通用 類型,可稱為類

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論