類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)_第1頁(yè)
類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)_第2頁(yè)
類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)_第3頁(yè)
類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)_第4頁(yè)
類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章類(lèi)與對(duì)象的構(gòu)造設(shè)計(jì)本章的學(xué)習(xí)目的

與人們認(rèn)識(shí)客觀世界一樣,面向?qū)ο蠹夹g(shù)認(rèn)為客觀世界是由各種各樣的實(shí)體組成,每個(gè)實(shí)體都可表示成一個(gè)對(duì)象。因此,客觀世界是由各種各樣的對(duì)象組成,每種對(duì)象都有各自的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,不同對(duì)象間相互作用和聯(lián)系就構(gòu)成了各種不同的系統(tǒng),從而形成了客觀世界。因此,在面向?qū)ο蟮某绦蛑?,客觀系統(tǒng)自然被描繪成一系列完全自治、封裝的對(duì)象。由此可見(jiàn),對(duì)象是組成面向?qū)ο蟪绦虻幕締挝弧C嫦驅(qū)ο蟮某绦蛴謱?duì)象劃分成類(lèi),類(lèi)定義了屬于該類(lèi)的所有對(duì)象的共同特征,它可作為生成對(duì)象的一種模板,使對(duì)象成為類(lèi)的實(shí)例。從語(yǔ)言角度來(lái)說(shuō),類(lèi)是一種新的數(shù)據(jù)類(lèi)型,是一種用戶自定義類(lèi)型,而對(duì)象是具有這種類(lèi)型的變量。類(lèi)是一種將數(shù)據(jù)和作用于這些數(shù)據(jù)上的操作組合在一起的復(fù)雜數(shù)據(jù)類(lèi)型,是可重用的基本單元。總之,類(lèi)和對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心支柱,利用它們可以實(shí)現(xiàn)數(shù)據(jù)的抽象、數(shù)據(jù)和操作的封裝以及信息的隱蔽,是實(shí)現(xiàn)其他許多高級(jí)特性的基礎(chǔ)。因此,我們應(yīng)該學(xué)習(xí)類(lèi)和對(duì)象的定義、設(shè)計(jì)和實(shí)現(xiàn)方法。通過(guò)面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)踐進(jìn)一步學(xué)習(xí)和領(lǐng)會(huì)面向?qū)ο蟮幕舅枷牒头椒夹g(shù)。本章的學(xué)習(xí)內(nèi)容學(xué)習(xí)和掌握類(lèi)的定義方法和對(duì)象的創(chuàng)建方法。學(xué)習(xí)和掌握類(lèi)的成員訪問(wèn)權(quán)限控制方法。學(xué)習(xí)和掌握構(gòu)造函數(shù)與析構(gòu)函數(shù)的用法學(xué)習(xí)和掌握類(lèi)的封裝、可見(jiàn)性和引用的操作方法了解結(jié)構(gòu)、聯(lián)合的面向?qū)ο筇匦院陀梅ā?/p>

3.1類(lèi)的構(gòu)造和對(duì)象的創(chuàng)建

3.1.1類(lèi)設(shè)計(jì)的基本原則在面向?qū)ο蟮某绦蛑?,客觀系統(tǒng)自然被描繪成一系列完全自治、封裝的對(duì)象,并將這些對(duì)象劃分成類(lèi),類(lèi)定義了屬于該類(lèi)的所有對(duì)象的共同特征,它可作為生成對(duì)象的一種模板,使對(duì)象成為類(lèi)的實(shí)例。

從整體功能層面談?lì)愒O(shè)計(jì),有如下三條原則:

·單一功能原則(SingleResponsibilityPrinciple)

一個(gè)class就其整體應(yīng)該只提供單一的服務(wù)。如果一個(gè)class提供多樣的服務(wù),那么就應(yīng)該把它拆分,反之,如果一個(gè)在概念上單一的功能卻由幾個(gè)class負(fù)責(zé),這幾個(gè)class應(yīng)該合并。

·開(kāi)放/封閉原則(Open/ClosePrinciple)

一個(gè)設(shè)計(jì)并實(shí)現(xiàn)好的class,應(yīng)該對(duì)擴(kuò)充開(kāi)放,而對(duì)修改封閉。即,這個(gè)class應(yīng)該是允許擴(kuò)充的,但不允許修改。如果需要功能上的擴(kuò)充,一般來(lái)說(shuō)應(yīng)該通過(guò)添加新類(lèi)實(shí)現(xiàn),而不是修改原類(lèi)的代碼。添加新類(lèi)不單可以通過(guò)直接繼承,也可以通過(guò)組合。

·最小驚訝原理(LeastSurprisePrinciple)

在重載函數(shù)或者用子類(lèi)實(shí)現(xiàn)父類(lèi)虛函數(shù)時(shí),應(yīng)該基本維持函數(shù)原來(lái)所期望的功能。3.1.2類(lèi)的說(shuō)明和對(duì)象的定義

類(lèi)定義的一般格式如下:

classclass_name{

private://私有成員,缺省默認(rèn)值

privatevariablesandfunction;

protected://保護(hù)成員

protected

variablesandfunction;

public://公有成員

public

variablesandfunction;

}object_list;說(shuō)明:(1)class_name是類(lèi)名;(2)關(guān)鍵字public、private和protected是訪問(wèn)權(quán)限修飾符,表示三種不同的訪問(wèn)權(quán)限。(3)類(lèi)的成員既可包括變量,又可包括函數(shù)。

(4)object_list為可選項(xiàng),用戶可在說(shuō)明類(lèi)之后,根據(jù)需要再定義類(lèi)的對(duì)象。例如:

class_name

object_list;【例3.1】類(lèi)的說(shuō)明與對(duì)象定義實(shí)例#include<iostream.h>

constintSIZE=10;

classstack

//類(lèi)名很重要

{

private:

//私有成員部分

charstk[SIZE];

int

tos;

public:

//公有成員部分

voidinit();

voidpush(char

ch);

charpop();

};

//初始化成員變量tosvoidstack::init(){tos=0;}//把一個(gè)字符壓入棧中voidstack::push(char

ch){

if(tos==SIZE)

{

cout<<"Stackisfull.\n";

return;

}

stk[tos]=ch;

tos++;}//彈出一個(gè)字符charstack::pop(){if(tos==0){

cout<<"Stackisempty.\n";

return0;

}

tos--;

returnstk[tos];

}intmain(){stacks1,s2;

inti;

s1.init();

s2.init();

s1.push('a');

s2.push('x');

s1.push('b');

s2.push('y');s1.push(‘c’);

s2.push(‘z’);

for(i=0;i<3;i++)cout<<s1.pop()<<“\t”;

for(i=0;i<3;i++)cout<<s2.pop()<<“\t”;

return0;}

運(yùn)行結(jié)果:cbazyx3.1.3成員函數(shù)的功能與定義方式

成員函數(shù)的功能和作用是:用于對(duì)象數(shù)據(jù)的處理操作,實(shí)現(xiàn)對(duì)象的操作行為,為外部程序提供操作接口。成員函數(shù)的定義方式有兩種:(1)外置方式:成員函數(shù)的聲明在類(lèi)的說(shuō)明體內(nèi),成員函數(shù)的定義則在類(lèi)外。如上例。注意:

(a)在函數(shù)名前標(biāo)明類(lèi)屬,形式是:

return_typeclass_name::function_name(para_list)(b)函數(shù)返回類(lèi)型與類(lèi)說(shuō)明中的類(lèi)型一致。(c)顯式指明函數(shù)參數(shù)的類(lèi)型和名字。(2)內(nèi)置方式:成員函數(shù)的聲明和定義均在類(lèi)的說(shuō)明體內(nèi)。內(nèi)置和外置的處理規(guī)則:對(duì)于比較小的成員函數(shù),在類(lèi)的說(shuō)明體內(nèi)定義,有助于減少調(diào)用開(kāi)銷(xiāo),提高運(yùn)行速度;而對(duì)比較大成員函數(shù),則在類(lèi)體外定義,這樣可以減少程序代碼的長(zhǎng)度。根據(jù)實(shí)際需要來(lái)決定。//內(nèi)置方式舉例#include<iostream.h>

constintSIZE=10;

classstack

//類(lèi)名很重要

{

private:

//私有成員部分

charstk[SIZE];

int

tos;

public:

//公有成員部分

voidinit(){tos=0;}//內(nèi)置定義

voidpush(char

ch);

charpop();

voidtest(){…x=pop();…}};

3.1.4對(duì)類(lèi)成員的訪問(wèn)

類(lèi)成員訪問(wèn)的原則是:

(1)成員函數(shù)可直接訪問(wèn)同類(lèi)中的成員變量和調(diào)用同類(lèi)中的成員函數(shù),不用在函數(shù)名前加上對(duì)象名。因?yàn)楣贸蓡T的作用域是不但包括類(lèi)說(shuō)明體,還包括它所屬對(duì)象的可視范圍(靜態(tài)成員除外);私有成員或受保護(hù)成員的作用域僅限于類(lèi)的說(shuō)明體和類(lèi)的成員函數(shù)。(2)可以在類(lèi)外訪問(wèn)公用成員,但必須在成員名前加上對(duì)象名。intmain(){stacks1,s2;

inti;

//在類(lèi)外訪問(wèn)公用成員s1.init();

s2.init();

s1.push('a');

s2.push('x');

s1.push('b');

s2.push('y');s1.push(‘c’);

s2.push(‘z’);

for(i=0;i<3;i++)cout<<s1.pop()<<“\t”;

for(i=0;i<3;i++)cout<<s2.pop()<<“\t”;

return0;}

表3.1使用關(guān)鍵字說(shuō)明的成員訪問(wèn)權(quán)限

表4-1->

上一頁(yè)|下一頁(yè)第4頁(yè)/共4頁(yè)所使用的關(guān)鍵字訪問(wèn)權(quán)限public(公有成員)可以為類(lèi)的成員函數(shù)、友元函數(shù)和外部的所有函數(shù)所訪問(wèn)protected(受保護(hù)成員)只能為類(lèi)的成員函數(shù)和友元函數(shù)所訪問(wèn)private(私有成員)只能為類(lèi)的成員函數(shù)和友元函數(shù)所訪問(wèn)

3.2構(gòu)造函數(shù)和析構(gòu)函數(shù)

在OOP中,創(chuàng)建對(duì)象時(shí)都需要作某種形式的初始化,為此,在C++的類(lèi)說(shuō)明中,引進(jìn)了構(gòu)造函數(shù)(constructorfunction),供創(chuàng)建類(lèi)的實(shí)例對(duì)象時(shí)調(diào)用,并自動(dòng)完成對(duì)象的初始化。例如:

classstack{charstk[SIZE];

int

tos;

public:

stack();

//這是一個(gè)構(gòu)造函數(shù)

voidpush(char

ch);

charpop();};stack::stack()

{cout<<“Constructingastack.\n”;

tos=0;

//初始化}intmain(){stacks1,s2;……}3.2.1構(gòu)造函數(shù)的特性

構(gòu)造函數(shù)具有以下特性:

(1)構(gòu)造函數(shù)的名稱與它所屬的類(lèi)名相同,且是無(wú)返回值類(lèi)型。

(2)一個(gè)類(lèi)可以有一個(gè)以上的構(gòu)造函數(shù),重載構(gòu)造函數(shù)參數(shù)個(gè)數(shù)或類(lèi)型不一樣。如果編程時(shí)在類(lèi)中沒(méi)有顯式定義構(gòu)造函數(shù),則編譯器會(huì)為類(lèi)自動(dòng)生成一個(gè)缺省構(gòu)造函數(shù),缺省構(gòu)造函數(shù)不帶任何參數(shù)。

(3)構(gòu)造函數(shù)是在用類(lèi)定義對(duì)象時(shí),由編譯器自動(dòng)調(diào)用的。構(gòu)造函數(shù)與一般成員函數(shù)性質(zhì)相同,同樣要受到訪問(wèn)限制,一個(gè)定義于非public區(qū)的構(gòu)造函數(shù)說(shuō)明該類(lèi)為私有類(lèi)。

【例3.2】私有類(lèi)實(shí)例#include“iostream.h”

classtest

{private:

inti;

staticintnumber;

test(inta){i=a;};

//該構(gòu)造函數(shù)為私有,在類(lèi)外不可訪問(wèn)

public:

voidshow();

staticvoidcount();};

int

test::number=0;

inlinevoidtest::show(){cout<<i;};

voidtest::count()

{testobj1(number);//雖然構(gòu)造函數(shù)為私有,但它對(duì)成員函數(shù)仍是可見(jiàn)的。

number++;obj1.show();}voidmain(){

testan_object;//此句是錯(cuò)誤的,因?yàn)闆](méi)有公有

//的構(gòu)造函數(shù),就無(wú)法在類(lèi)之外創(chuàng)建對(duì)象。

for(intj=0;j<5;j++)

{

test::count();

cout<<'\t';

}}

3.2.2構(gòu)造函數(shù)的設(shè)計(jì)和使用

3.2.2.1帶參數(shù)的構(gòu)造函數(shù)例3.3帶參數(shù)的構(gòu)造函數(shù)

classpointer{

int

x,y;

public:

pointer(int

cx,intcy);

voidoffset(int

ox,int

oy);};pointer::pointer(int

cx,intcy){

x=cx;

//用參數(shù)對(duì)變量作初始化

y=cy;}

voidpointer::offset(int

ox,int

oy){

x=x+ox;

//私有變量增值

y=y+oy;}voidmain(){

pointerpt1(20,30);

//定義對(duì)象時(shí)初始化

//也可采用下面語(yǔ)法形式:pointerpt1=pointer(20,30);

pt1.offset(40,35);

//如上句無(wú)參,則本句無(wú)效

…}

構(gòu)造函數(shù)常常使用缺省值,因?yàn)槿绻麡?gòu)造函數(shù)定義了缺省值,在函數(shù)調(diào)用時(shí),若無(wú)特別指定參數(shù),便可用缺省值作初始化。而且也可防止遺漏初始賦值。例如:可將上述函數(shù)改為帶缺省參數(shù)的構(gòu)造函數(shù)。classpointer{

int

x,y;public:

pointer(int

cx=0,intcy=0)

{x=cx;y=cy;}

…};voidmain(){

pointerpta;

//實(shí)際是x=0,y=0

//由于定義了缺省參數(shù),調(diào)用時(shí)允許不帶參數(shù)

pointerptb(20);

//實(shí)際是x=20,y=0

pointerptc(30,40);

//實(shí)際是x=30,y=40

}如果函數(shù)調(diào)用時(shí)的實(shí)參個(gè)數(shù)不足,編譯器將優(yōu)先匹配前面的形參,而不管前面的形參是否有缺省值。例如,某函數(shù)原型為func(int

a,intb=0,intc=2),它有3個(gè)參數(shù)。若調(diào)用時(shí)采用:func(3,5)

的形式,則編譯器將理解為:a=3,b=5,c=2;//自動(dòng)匹配前兩個(gè)形參,b不用缺省值,c使用了缺省值2。

因此,如果最后若干個(gè)參數(shù)沒(méi)有缺省值,而調(diào)用時(shí)參數(shù)又不夠,則會(huì)發(fā)生參數(shù)不足的錯(cuò)誤。

構(gòu)造函數(shù)的缺省參數(shù)只能在參數(shù)表的后面定義。例如:

1)boy(int

x,inty=0);

//正確

2)boy(intx=0,inty);

//錯(cuò)誤

3)fun(int

i,int

j,intk=99);

//正確

4)fun(int

i,intj=88,intk);

//錯(cuò)誤

當(dāng)構(gòu)造函數(shù)只有一個(gè)參數(shù)時(shí),可采用以下形式來(lái)定義對(duì)象:

class_name

obj_name=value;例如:classmyclass{

inta;

public:

myclass(intj){a=j;};//…

};….

voidmain()

{

myclass

obj=2008;

//在一個(gè)參數(shù)的情況下可以使用這

//種形式,將初始值傳遞給對(duì)象

}

3.2.2.2多構(gòu)造函數(shù)

對(duì)于一個(gè)類(lèi)的不同對(duì)象,當(dāng)需要不同類(lèi)型和個(gè)數(shù)的初始化參數(shù)時(shí),可以在一個(gè)類(lèi)中定義幾個(gè)構(gòu)造函數(shù)。例如

classdtl{……;public:

dtobj1();

dtobj2(int);

dtobj3(int,char);

dtobj4(float,int);……};

所定義的多個(gè)構(gòu)造函數(shù)之間,在參數(shù)個(gè)數(shù)或數(shù)據(jù)類(lèi)型上必須有差異。在定義對(duì)象時(shí),使用缺省參數(shù)調(diào)用多構(gòu)造函數(shù)時(shí),要特別注意二義性。例如:

classdtl{……;public:

dt();

dt(int

ar=0);……};voidmain(){dtlob1(33);//與dtl(int)相匹配

dtlob2;//發(fā)生二義性錯(cuò)誤……};

3.2.2.3復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它的功能是用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)被定義的同類(lèi)的對(duì)象。復(fù)制構(gòu)造函數(shù)的定義格式如下:class<類(lèi)名>{public:

<類(lèi)名>(<參數(shù)表>);

//構(gòu)造函數(shù)

<類(lèi)名>(const<類(lèi)名>&<對(duì)象名>);

//拷貝構(gòu)造

…};<類(lèi)名>::<類(lèi)名>(const<類(lèi)名>&<對(duì)象名>)

//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){<復(fù)制構(gòu)造函數(shù)體>}classpointer{int

x,y;public:

pointer(int

cx,int

cy){x=cx;y=cy;}

pointer(constpointer&p){x=p.x;y=p.y;}……;};voidmain(){pointerob1(40,50);pointerob2=ob1;……}

淺復(fù)制與深復(fù)制(1)淺復(fù)制:在用一個(gè)對(duì)象初始化另一個(gè)對(duì)象時(shí),如果只復(fù)制了成員,并沒(méi)有復(fù)制資源,使兩個(gè)對(duì)象同時(shí)指向了同一資源的復(fù)制方式稱為淺復(fù)制,如圖(a)所示。(2)深復(fù)制:在用一個(gè)對(duì)象初始化另一個(gè)對(duì)象時(shí),如果不僅復(fù)制了成員,也復(fù)制了資源,則這種復(fù)制方式稱為深復(fù)制,如圖(b)所示。

如果在類(lèi)中沒(méi)有顯式定義復(fù)制構(gòu)造函數(shù),則用一個(gè)對(duì)象初始化另一個(gè)對(duì)象時(shí)只能用編譯器提供的缺省復(fù)制構(gòu)造函數(shù)來(lái)進(jìn)行淺復(fù)制;否則可用顯式定義的復(fù)制構(gòu)造函數(shù)來(lái)進(jìn)行深復(fù)制。(3)如果類(lèi)中包含指針成員且在創(chuàng)建一個(gè)對(duì)象時(shí)需要?jiǎng)討B(tài)分配內(nèi)存資源,則必須顯式定義復(fù)制構(gòu)造函數(shù),以實(shí)現(xiàn)深復(fù)制。如果在類(lèi)中不顯式定義復(fù)制構(gòu)造函數(shù),則用一個(gè)對(duì)象初始化另一個(gè)對(duì)象時(shí)只能用編譯器提供的缺省復(fù)制構(gòu)造函數(shù)來(lái)進(jìn)行淺復(fù)制,就會(huì)使兩個(gè)對(duì)象的成員指針指向同一個(gè)內(nèi)存區(qū),當(dāng)一個(gè)指針被釋放以后,另一個(gè)指針就會(huì)懸空,出現(xiàn)錯(cuò)誤。

3.2.3析構(gòu)函數(shù)的特性和用法析構(gòu)函數(shù)也是成員函數(shù),與構(gòu)造函數(shù)相對(duì)應(yīng),命名是在構(gòu)造類(lèi)名前加~

(波浪線)。析構(gòu)函數(shù)只能是無(wú)返回值類(lèi)型。析構(gòu)函數(shù)不能有任何參數(shù)。析構(gòu)函數(shù)不能重載,一個(gè)類(lèi)只允許有一個(gè)析構(gòu)函數(shù)。當(dāng)對(duì)象離開(kāi)其有效范圍,或被取消時(shí),析構(gòu)函數(shù)將被調(diào)用來(lái)釋放對(duì)象所占用的內(nèi)存。因此,析構(gòu)函數(shù)的定義,一般是由一系列的delete組成。

#include<string.h>

classsample

{private:

char*pointer_char;

public:

sample(){pointer_char=NULL;};

sample(sample&ob)

{

pointer_char=newchar[strlen(ob.pointer_char)+1];

strcpy(pointer_char,ob.pointer_char);

};

~sample(){if(pointer_char!=NULL)

deletepointer_char;};

};

3.3類(lèi)的靜態(tài)成員和動(dòng)態(tài)存儲(chǔ)分配靜態(tài)成員是類(lèi)的所有對(duì)象共享的成員,而不是某個(gè)對(duì)象所特有的成員,是屬于整個(gè)類(lèi)的成員。它是為解決同一個(gè)類(lèi)的不同對(duì)象之間數(shù)據(jù)和函數(shù)的共享而設(shè)計(jì)的。靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。

其定義格式為:

static

<靜態(tài)成員的定義>;靜態(tài)成員函數(shù)是被一個(gè)類(lèi)中所有對(duì)象共享的成員函數(shù),不屬于某個(gè)特定對(duì)象。因此,一般只用于訪問(wèn)靜態(tài)數(shù)據(jù)成員或全局變量。調(diào)用靜態(tài)成員函數(shù),可以在其名字前面加類(lèi)名或?qū)ο竺?,但使用?duì)象名容易令人產(chǎn)生混淆,故不鼓勵(lì)使用。例3.4’靜態(tài)成員的定義方法//student.h#include<iostream.h>#include<string.h>classStudent{protected:

staticinttotal;

charname[11];public:

Student(char*pname=“noname”);~Student();

staticintnumber(){returntotal;}}Student::Student(char*pname){cout<<“createonestudent”<<endl;

strcpy(name,pname);

total++;//每創(chuàng)建一個(gè)對(duì)象,學(xué)生人數(shù)增1

cout<<total<<endl;}Student::~Student(){cout<<“destructonestudent”<<endl;

total--;//每析構(gòu)一個(gè)對(duì)象,學(xué)生人數(shù)減1

cout<<total<<endl;}【例3.5】帶有靜態(tài)成員的類(lèi)的實(shí)例

#include<iostream.h>classMyClass{private:

staticint

m_Count;public:

staticint

get_Count(){returnm_Count;};

staticvoidAdd(){m_Count++;};};

int

MyClass::m_Count=0;

//必須在類(lèi)外進(jìn)行初voidmain(){cout<<"Count="<<MyClass::get_Count()<<endl;

for(intj=0;j<4;j++)

MyClass::Add();

cout<<"Count="<<MyClass::get_Count()<<endl;

}

3.3.2對(duì)象的動(dòng)態(tài)存儲(chǔ)分配在C中,內(nèi)存動(dòng)態(tài)分配和釋放用函數(shù)malloc()和free();而在C++中,通常使用new和delete。new運(yùn)算符的三種常用格式:格式1:<指針變量名>=new<類(lèi)型>

功能:分配一塊與<類(lèi)型>相適應(yīng)的存儲(chǔ)空間,若分配成功,將這塊內(nèi)存空間的首地址存入指針變量,否則置指針變量的值為NULL(空指針值,即0)。格式2:<指針變量名>=new<類(lèi)型>(<初值>)功能:分配一塊與<類(lèi)型>相適應(yīng)的存儲(chǔ)空間,并用<初值>為分配好的存儲(chǔ)空間置初值。若分配成功,將這塊內(nèi)存空間的首地址存入指針變量,否則置指針變量的值為NULL(空指針值,即0)例如:

int*p;p=newint(100);//動(dòng)態(tài)存儲(chǔ)分配一個(gè)整數(shù)單元,

//并給它賦初值100。格式3:<指針變量名>=new<類(lèi)型>[<元素個(gè)數(shù)>]

功能:申請(qǐng)大小為<元素個(gè)數(shù)>的數(shù)組空間。但創(chuàng)建數(shù)組時(shí),不能為該數(shù)組指定初始值。例如:int*p;p=newint[10];//動(dòng)態(tài)分配一個(gè)含

//有10個(gè)整數(shù)的數(shù)組。delete運(yùn)算符的二種常用格式:格式1:delete<指針變量名>功能:釋放<指針變量名>指向的動(dòng)態(tài)存儲(chǔ)空間。例如:deletep;格式2:delete[]<指針變量名>

功能:用于釋放數(shù)組占用的動(dòng)態(tài)存儲(chǔ)空間。例如:int*p;p=newint[10];deletep;使用的語(yǔ)法格式使用方法列舉pointer_var=newvar_type;

deletepointer_var;int*p;

p=newint;

int*q;

q=newint(1999);//初始化float*f;

f=newfloat[15];//為一維數(shù)組分配動(dòng)態(tài)內(nèi)存delete[]f;#include<iostream.h>classpoint{int

x,y;

public:

point(int

cx=0,intcy=0)

{x=cx;y=cy;}

voidprint(){cout<<x<<""<<y<<"\n";}};intmain(){point*pp;

pp=newpoint(20,30);

//分配空間,調(diào)用構(gòu)造函數(shù)進(jìn)行初始化

if(!pp)

{cout<<"allocationfailure\n";return0;}

pp->print();

deletepp;

return1;}

3.4友元

3.4.1友元的定義根據(jù)封裝性,如果將類(lèi)中的數(shù)據(jù)成員聲明為私有成員,外部可以通過(guò)類(lèi)的公有成員函數(shù)對(duì)私有成員進(jìn)行訪問(wèn)。但有時(shí)類(lèi)體外的一些函數(shù)需要直接訪問(wèn)類(lèi)的數(shù)據(jù)成員,又不改變其數(shù)據(jù)成員的訪問(wèn)權(quán)限,這時(shí),需要把那些函數(shù)定義成友元。友元不是類(lèi)的成員,但可以訪問(wèn)類(lèi)中所有成員。友元通常是一個(gè)普通函數(shù)或者另一個(gè)類(lèi)的成員函數(shù)或者類(lèi)。友元可以避免頻繁調(diào)用類(lèi)的接口函數(shù),提高了程序的運(yùn)行速度和使用效率。但它破壞了類(lèi)的封閉性和隱蔽性。友元的定義如果友元是普通函數(shù)或另一個(gè)類(lèi)的成員函數(shù),稱為友元函數(shù);如果友元是一個(gè)類(lèi),則稱為友元類(lèi),友元類(lèi)的所有成員函數(shù)都成為友元函數(shù)。友元函數(shù)和友元類(lèi)在被訪問(wèn)的類(lèi)中聲明,其格式分別如下:

friend<返回值類(lèi)型><函數(shù)名>(<參數(shù)表>);

friend<類(lèi)名>;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論