C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件_第1頁
C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件_第2頁
C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件_第3頁
C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件_第4頁
C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件_第5頁
已閱讀5頁,還剩133頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第9章怎樣使用類和對(duì)象9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.2析構(gòu)函數(shù)9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序9.4對(duì)象數(shù)組9.5對(duì)象指針9.6共用數(shù)據(jù)的保護(hù)9.7對(duì)象的動(dòng)態(tài)建立和釋放9.8對(duì)象的賦值和復(fù)制9.9靜態(tài)成員9.10友元9.11類模板第9章怎樣使用類和對(duì)象9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行19.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.1.1對(duì)象的初始化在建立一個(gè)對(duì)象時(shí),常常需要作某些初始化的工作,例如對(duì)數(shù)據(jù)成員賦初值。如果一個(gè)數(shù)據(jù)成員未被賦值,則它的值是不可預(yù)知的。注意:類的數(shù)據(jù)成員是不能在聲明類時(shí)初始化的。classTime{public://聲明為公用成員

hour=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化minute=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化sec=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化};

9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.1.1對(duì)象的初2如果一個(gè)類中所有的成員都是公用的,則可以在定義對(duì)象時(shí)對(duì)數(shù)據(jù)成員進(jìn)行初始化。如classTime{public://聲明為公用成員

hour;minute;sec;};Timet1={14,56,30};//將t1初始化為14:56:30但是,如果數(shù)據(jù)成員是私有的,或者類中有private或protected的成員,就不能用這種方法初始化。

如果一個(gè)類中所有的成員都是公用的,則可以在定義對(duì)象時(shí)對(duì)數(shù)據(jù)成3structStudent//結(jié)構(gòu)聲明{intnum;charname[20];floatscore;};Studentstu1={1001,“zhangsan”,89};//對(duì)定義結(jié)構(gòu)體變量時(shí)同時(shí)初始化對(duì)結(jié)構(gòu)體,其成員默認(rèn)是publicstructStudent//結(jié)構(gòu)聲明{private:intnum;charname[20];floatscore;};Studentstu1={1001,“zhangsan”,89};//錯(cuò)錯(cuò):不能對(duì)私有成員初始化structStudent//結(jié)構(gòu)聲明定義結(jié)構(gòu)體變4Student類classStudent//類聲明{private:intnum;charname[20];floatscore;

public:voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;}}數(shù)據(jù)成員是私有的,本類外不能直接訪問Studentstu1={1001,”zhangsan”,89};//定義對(duì)象并初始化?不能!Student類classStudent//類聲5C++提供了構(gòu)造函數(shù)(constructor)來處理對(duì)象的初始化。構(gòu)造函數(shù)是一種特殊的成員函數(shù),與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名,以便編譯系統(tǒng)能識(shí)別它并把它作為構(gòu)造函數(shù)處理。它不具有任何類型,不返回任何值。構(gòu)造函數(shù)的功能是由用戶定義的,用戶根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。9.1.2構(gòu)造函數(shù)的作用C++提供了構(gòu)造函數(shù)(constructor)來6創(chuàng)建Student類的構(gòu)造函數(shù)#include<iostream>usingnamespacestd;classStudent{private:intnum;charname[20];floatscore;public:

Student(intn,char*p,floats);

//構(gòu)造函數(shù)的聲明voiddisplay();};Student::Student(intn,char*p,floats)//構(gòu)造函數(shù)的定義{num=n;strcpy(name,p);score=s;}創(chuàng)建Student類的構(gòu)造函數(shù)#include<iost7創(chuàng)建Student類的構(gòu)造函數(shù)voidStudent::display(){cout<<"display:"<<endl;cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;};intmain(){Studentstu1(1001,"zhangsan",89);

stu1.display();return0;}在建立對(duì)象stu1時(shí),系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)一次:Student(1001,"zhangsan",89)將初始值存儲(chǔ)到對(duì)象stu1中。創(chuàng)建Student類的構(gòu)造函數(shù)voidStudent::d8#include<iostream>usingnamespacestd;classStudent{private:intnum;charname[20];floatscore;public:

Student(intn,char*p,floats);

//構(gòu)造函數(shù)的聲明voiddisplay();};Student::Student(intn,char*p,floats)//構(gòu)造函數(shù)的定義{num=n;strcpy(name,p);score=s;}構(gòu)造函數(shù)代碼與input()函數(shù)相同input(intn,char*p,floats);

//輸入函數(shù)的聲明Student::input(intn,char*p,floats)//輸入函數(shù)的定義#include<iostream>構(gòu)造函數(shù)代碼與inp9voidStudent::display(){cout<<"display:"<<endl;cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;};intmain(){Studentstu1;stu1.input(1001,"zhangsan",89);

stu1.display();return0;}構(gòu)造函數(shù)代碼與input()函數(shù)相同要調(diào)用對(duì)象stu1的成員函數(shù)input(),通過它輸入相關(guān)的數(shù)據(jù)。voidStudent::display()構(gòu)造函數(shù)代碼10特殊的類成員函數(shù);與類名同名;

雖然沒有返回值,但沒有被聲明為void類型。實(shí)際上,構(gòu)造函數(shù)沒有聲明類型;在建立對(duì)象時(shí)自動(dòng)調(diào)用執(zhí)行;C++為構(gòu)造函數(shù)提供了名稱和使用句法,程序員則根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。構(gòu)造函數(shù)特性

特殊的類成員函數(shù);構(gòu)造函數(shù)特性

11例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。#include<iostream>usingnamespacestd;classTime{public:

Time()//定義構(gòu)造成員函數(shù),函數(shù)名與類名相同

{hour=0;//利用構(gòu)造函數(shù)對(duì)對(duì)象中的數(shù)據(jù)成員賦初值

minute=0;

sec=0;

}voidset_time();//函數(shù)聲明voidshow_time();//函數(shù)聲明private:

inthour;//私有數(shù)據(jù)成員

intminute;

intsec;};例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。12voidTime∷set_time()//定義成員函數(shù),向數(shù)據(jù)成員賦值{cin>>hour;cin>>minute;cin>>sec;}voidTime∷show_time()//定義成員函數(shù),輸出數(shù)據(jù)成員的值{

cout<<hour<<″:″<<minute<<″:″<<sec<<endl;}intmain(){Timet1;//建立對(duì)象t1,同時(shí)調(diào)用構(gòu)造函數(shù)t1.Time()t1.set_time();//對(duì)t1的數(shù)據(jù)成員賦值t1.show_time();//顯示t1的數(shù)據(jù)成員的值Timet2;//建立對(duì)象t2,同時(shí)調(diào)用構(gòu)造函數(shù)t2.Time()t2.show_time();//顯示t2的數(shù)據(jù)成員的值return0;}程序運(yùn)行的情況為:102554↙(從鍵盤輸入新值賦給t1的數(shù)據(jù)成員)10:25:54(輸出t1的時(shí)、分、秒值)0:0:0(輸出t2的時(shí)、分、秒值)voidTime∷set_time()/13也可以只在類內(nèi)對(duì)構(gòu)造函數(shù)進(jìn)行聲明而在類外定義構(gòu)造函數(shù)。classTime{public:

Time()

{hour=0;

minute=0;

sec=0;

}voidset_time();voidshow_time();private:inthour;intminute;intsec;};classTime{public:

Time();voidset_time();voidshow_time();private:inthour;intminute;intsec;};Time::Time(){hour=0;

minute=0;

sec=0;

}也可以只在類內(nèi)對(duì)構(gòu)造函數(shù)進(jìn)行聲明而在類外定義構(gòu)造函數(shù)。cla14在例9.1中構(gòu)造函數(shù)不帶參數(shù),在函數(shù)體中對(duì)數(shù)據(jù)成員賦初值。這種方式使該類的每一個(gè)對(duì)象都得到同一組初值(例如例9.1中各數(shù)據(jù)成員的初值均為0)。但是有時(shí)用戶希望對(duì)不同的對(duì)象賦予不同的初值。可以采用帶參數(shù)的構(gòu)造函數(shù),在調(diào)用不同對(duì)象的構(gòu)造函數(shù)時(shí),從外面將不同的數(shù)據(jù)傳遞給構(gòu)造函數(shù),以實(shí)現(xiàn)不同的初始化。構(gòu)造函數(shù)首部的一般格式為

構(gòu)造函數(shù)名(類型1形參1,類型2形參2,…)前面已說明:用戶是不能調(diào)用構(gòu)造函數(shù)的,因此無法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參。實(shí)參是在定義對(duì)象時(shí)給出的。定義對(duì)象的一般格式為

類名對(duì)象名(實(shí)參1,實(shí)參2,…);9.1.3帶參數(shù)的構(gòu)造函數(shù)在例9.1中構(gòu)造函數(shù)不帶參數(shù),在函數(shù)體中對(duì)數(shù)據(jù)成員15有兩個(gè)長方柱,其長、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。編一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);//聲明帶參數(shù)的構(gòu)造函數(shù)intvolume();//聲明計(jì)算體積的成員函數(shù)

private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在類外定義帶參數(shù)的構(gòu)造函數(shù){height=h;width=w;length=len;}//例9.2有兩個(gè)長方柱,其長、寬、高分別為:(1)12,2016intBox∷volume()//定義計(jì)算體積的成員函數(shù){return(height*width*length);}intmain(){Boxbox1(12,25,30);//建立對(duì)象box1,并指定box1長、寬、高的值cout<<″Thevolumeofbox1is″<<box1.volume()<<endl;Boxbox2(15,30,21);//建立對(duì)象box2,并指定box2長、寬、高的值cout<<″Thevolumeofbox2is″<<box2.volume()<<endl;return0;}程序運(yùn)行結(jié)果如下:Thevolumeofbox1is9000Thevolumeofbox2is9450//例9.2intBox∷volume()17在9.1.3節(jié)中介紹的是在構(gòu)造函數(shù)的函數(shù)體內(nèi)通過賦值語句對(duì)數(shù)據(jù)成員實(shí)現(xiàn)初始化。C++還提供另一種初始化數(shù)據(jù)成員的方法——參數(shù)初始化表來實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化。這種方法不在函數(shù)體內(nèi)對(duì)數(shù)據(jù)成員初始化,而是在函數(shù)首部實(shí)現(xiàn)。例如例9.2中定義構(gòu)造函數(shù)可以改用以下形式:Box∷Box(inth,intw,intlen):height(h),width(w),length(len){}類名::構(gòu)造函數(shù)名(參數(shù)表):成員初始化表

{構(gòu)造函數(shù)體}這種寫法方便、簡練,尤其當(dāng)需要初始化的數(shù)據(jù)成員較多時(shí)更顯其優(yōu)越性。甚至可以直接在類體中(而不是在類外)定義構(gòu)造函數(shù)。9.1.4用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化在9.1.3節(jié)中介紹的是在構(gòu)造函數(shù)的函數(shù)體內(nèi)通過賦值語句對(duì)數(shù)18classBox{public:

Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}賦值語句對(duì)數(shù)據(jù)成員實(shí)現(xiàn)初始化classBox{public:

Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen):height(h),width(w),length(len){}參數(shù)初始化表實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化classBoxclassBox19在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以便對(duì)類對(duì)象提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個(gè)數(shù)或參數(shù)的類型不相同。這稱為構(gòu)造函數(shù)的重載。在第4章第4.8節(jié)中所介紹的函數(shù)重載的知識(shí)也適用于構(gòu)造函數(shù)。9.1.5構(gòu)造函數(shù)的重載在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以便對(duì)類對(duì)象提供不同的初始化20例9.3在例9.2的基礎(chǔ)上,定義兩個(gè)構(gòu)造函數(shù),其中一個(gè)無參數(shù),一個(gè)有參數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box();

//聲明一個(gè)無參的構(gòu)造函數(shù)

Box(inth,intw,intlen):height(h),width(w),length(len){};

//聲明一個(gè)有參的構(gòu)造函數(shù),用參數(shù)的初始化表對(duì)數(shù)據(jù)成員初始化intvolume();private:intheight;intwidth;intlength;};Box∷Box()//定義一個(gè)無參的構(gòu)造函數(shù){height=10;width=10;length=10;}例9.3在例9.2的基礎(chǔ)上,定義兩個(gè)構(gòu)造函數(shù),其中一個(gè)無參21intBox∷volume(){return(height*width*length);}intmain(){Boxbox1;//建立對(duì)象box1,不指定實(shí)參cout<<″Thevolumeofbox1is″<<box1.volume()<<endl;Boxbox2(15,30,25);//建立對(duì)象box2,指定3個(gè)實(shí)參cout<<″Thevolumeofbox2is″<<box2.volume()<<endl;return0;}intBox∷volume()22說明:(1)在建立對(duì)象時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)(defaultconstructor)。顯然,無參的構(gòu)造函數(shù)屬于默認(rèn)構(gòu)造函數(shù)。一個(gè)類只能有一個(gè)默認(rèn)構(gòu)造函數(shù)。(2)如果在建立對(duì)象時(shí)選用的是無參構(gòu)造函數(shù),應(yīng)注意正確書寫定義對(duì)象的語句:類名對(duì)象名;(3)盡管在一個(gè)類中可以包含多個(gè)構(gòu)造函數(shù),但是對(duì)于每一個(gè)對(duì)象來說,建立對(duì)象時(shí)只執(zhí)行其中一個(gè)構(gòu)造函數(shù),并非每個(gè)構(gòu)造函數(shù)都被執(zhí)行。說明:23

構(gòu)造函數(shù)中參數(shù)的值既可以通過實(shí)參傳遞,也可以指定為某些默認(rèn)值,即如果用戶不指定實(shí)參值,編譯系統(tǒng)就使形參取默認(rèn)值。在第4章第4.10節(jié)中介紹過在函數(shù)中可以使用有默認(rèn)值的參數(shù)。在構(gòu)造函數(shù)中也可以采用這樣的方法來實(shí)現(xiàn)初始化。9.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通過實(shí)參傳遞,也可以指定為某24例9.4將例9.3程序中的構(gòu)造函數(shù)改用含默認(rèn)值的參數(shù),長、寬、高的默認(rèn)值均為10#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=10,intlen=10);//在聲明構(gòu)造函數(shù)時(shí)指定默認(rèn)參數(shù)intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在定義函數(shù)時(shí)可以不指定默認(rèn)參數(shù){height=h;width=w;length=len;}例9.4將例9.3程序中的構(gòu)造函數(shù)改用含默認(rèn)值的參數(shù),25intBox∷volume(){return(height*width*length);}intmain(){Boxbox1;//沒有給實(shí)參cout<<″Thevolumeofbox1is″<<box1.volume()<<endl;Boxbox2(15);//只給定一個(gè)實(shí)參cout<<″Thevolumeofbox2is″<<box2.volume()<<endl;Boxbox3(15,30);//只給定2個(gè)實(shí)參cout<<″Thevolumeofbox3is″<<box3.volume()<<endl;Boxbox4(15,30,20);//給定3個(gè)實(shí)參cout<<″Thevolumeofbox4is″<<box4.volume()<<endl;return0;}intBox∷volume()26當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。每個(gè)類只能有一個(gè)析構(gòu)函數(shù);析構(gòu)函數(shù)沒有返回類型(連void也沒有),也沒有參數(shù);其名稱為類名稱前加上~~Student();//Student類析構(gòu)函數(shù)析構(gòu)函數(shù)的任務(wù)由程序設(shè)計(jì)者安排。如:完成清理工作,釋放內(nèi)存等。

9.2析構(gòu)函數(shù)當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。9.2析構(gòu)函27classStudent{private:intnum;charname[20];floatscore;public:

Student(intn,char*p,floats);

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

~Student();//析構(gòu)函數(shù)聲明 voiddisplay() {cout<<"\ndisplay:\nnum:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"score:"<<score<<endl; }};intmain(){Studentstu1(1001,"zhangsan",89);stu1.display();return0;//當(dāng)函數(shù)結(jié)束前,要釋放對(duì)象stu1的空間,此時(shí)自動(dòng)調(diào)用~Student}Student::Student(intn,char*p,floats)//構(gòu)造函數(shù)定義{num=n;strcpy(name,p);score=s;}Student::~Student()//析構(gòu)函數(shù)定義{cout<<“結(jié)束”;}classStudent28例:

classAA{AA(){……}//構(gòu)造函數(shù)~AA(){……}//析構(gòu)函數(shù)……};……voidtest(){intx,y; AAt1,t2; ……return;}構(gòu)造函數(shù)和析構(gòu)函數(shù)例:構(gòu)造函數(shù)和析構(gòu)函數(shù)29例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y; AAt1,t2; ……return;}構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)例:構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)30例:

classAA{AA(){……}

~AA(){……}……};……voidtest(){intx,y; AAt1,t2; ……return;}析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)例:析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)31例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y;

AAt1,t2; ……return;}//聲明變量時(shí)開辟兩個(gè)整型存儲(chǔ)空間構(gòu)造函數(shù)和析構(gòu)函數(shù)例://聲明變量時(shí)開辟兩個(gè)整型存儲(chǔ)空間構(gòu)造函數(shù)和析構(gòu)32例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y;

AAt1,t2;

……return;}//創(chuàng)建2個(gè)對(duì)象,兩次調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)例://創(chuàng)建2個(gè)對(duì)象,兩次調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)和33例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y;

AAt1,t2;

……return;}//創(chuàng)建2個(gè)對(duì)象,兩次調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)例://創(chuàng)建2個(gè)對(duì)象,兩次調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)和34例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y; AAt1,t2; ……

return;}//兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)例://兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)35例:

classAA{AA(){……}

~AA(){……}……};……voidtest(){intx,y; AAt1,t2; ……

return;}//兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)例://兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)36例:

classAA{AA(){……}~AA(){……}……};……voidtest(){intx,y; AAt1,t2; ……

return;}//兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象//變量x,y生存期結(jié)束構(gòu)造函數(shù)和析構(gòu)函數(shù)例://兩次調(diào)用析構(gòu)函數(shù),撤消對(duì)象//變量x,y生存37有兩個(gè)長方柱,其長、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。編一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);

//聲明帶參數(shù)的構(gòu)造函數(shù)

~Box();//沒有函數(shù)類型,沒有參數(shù)intvolume();//聲明計(jì)算體積的成員函數(shù)

private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在類外定義帶參數(shù)的構(gòu)造函數(shù){height=h;width=w;length=len;

cout<<“構(gòu)造函數(shù)被調(diào)用”<<endl;}Box::~Box(){cout<<“析構(gòu)函數(shù)被自動(dòng)調(diào)用”<<endl;}有兩個(gè)長方柱,其長、寬、高分別為:(1)12,20,25;38intBox∷volume()//定義計(jì)算體積的成員函數(shù){return(height*width*length);}intmain(){Boxbox1(12,25,30);

//建立對(duì)象box1,并指定box1長、寬、高的值cout<<″Thevolumeofbox1is″<<box1.volume()<<endl;Boxbox2(15,30,21);

//建立對(duì)象box2,并指定box2長、寬、高的值cout<<″Thevolumeofbox2is″<<box2.volume()<<endl;return0;//結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)}顯示:構(gòu)造函數(shù)被調(diào)用

Thevolumeofbox1is

9000構(gòu)造函數(shù)被調(diào)用

Thevolumeofbox2is

9450

析構(gòu)函數(shù)被調(diào)用析構(gòu)函數(shù)被調(diào)用intBox∷volume()399.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序在使用構(gòu)造函數(shù)和析構(gòu)函數(shù)時(shí),需要特別注意對(duì)它們的調(diào)用時(shí)間和調(diào)用順序。在一般情況下,調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反:最先被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的(同一對(duì)象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的析構(gòu)函數(shù)最先被調(diào)用。如圖9.1示意。9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序在使40圖9.1C++程序設(shè)計(jì)-cchp9怎樣使用類和對(duì)象課件419.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序main(){Boxbox1(1,2,3);Boxbox2(2,5,3);Boxbox3(1,1,1);…………return;}box1的構(gòu)造函數(shù)被調(diào)用Box2的構(gòu)造函數(shù)被調(diào)用Box3的構(gòu)造函數(shù)被調(diào)用Box3的析構(gòu)函數(shù)被調(diào)用Box2的析構(gòu)函數(shù)被調(diào)用Box1的析構(gòu)函數(shù)被調(diào)用9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序main()box142但是,并不是在任何情況下都是按這一原則處理的。在第4章第4.11和4.12節(jié)中曾介紹過作用域和存儲(chǔ)類別的概念,這些概念對(duì)于對(duì)象也是適用的。對(duì)象可以在不同的作用域中定義,可以有不同的存儲(chǔ)類別。這些會(huì)影響調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的時(shí)機(jī)。下面歸納一下什么時(shí)候調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù):(1)在全局范圍中定義的對(duì)象(即在所有函數(shù)之外定義的對(duì)象),它的構(gòu)造函數(shù)在文件中的所有函數(shù)(包括main函數(shù))執(zhí)行之前調(diào)用。但如果一個(gè)程序中有多個(gè)文件,而不同的文件中都定義了全局對(duì)象,則這些對(duì)象的構(gòu)造函數(shù)的執(zhí)行順序是不確定的。當(dāng)main函數(shù)執(zhí)行完畢或調(diào)用exit函數(shù)時(shí)(此時(shí)程序終止),調(diào)用析構(gòu)函數(shù)。但是,并不是在任何情況下都是按這一原則處理的43Boxbox1(1,2,3);main(){Boxbox2(2,5,3);Boxbox3(1,1,1);…………return;}全局對(duì)象box1的構(gòu)造函數(shù)被調(diào)用局部自動(dòng)對(duì)象Box2的構(gòu)造函數(shù)被調(diào)用局部對(duì)象Box3的構(gòu)造函數(shù)被調(diào)用Box3的析構(gòu)函數(shù)被調(diào)用Box2的析構(gòu)函數(shù)被調(diào)用Box1的析構(gòu)函數(shù)被調(diào)用Boxbox1(1,2,3);全局對(duì)象box1的構(gòu)造函數(shù)44(2)如果定義的是局部自動(dòng)對(duì)象(例如在函數(shù)中定義對(duì)象),則在建立對(duì)象時(shí)調(diào)用其構(gòu)造函數(shù)。如果函數(shù)被多次調(diào)用,則在每次建立對(duì)象時(shí)都要調(diào)用構(gòu)造函數(shù)。在函數(shù)調(diào)用結(jié)束、對(duì)象釋放時(shí)先調(diào)用析構(gòu)函數(shù)。(3)如果在函數(shù)中定義靜態(tài)(static)局部對(duì)象,則只在程序第一次調(diào)用此函數(shù)建立對(duì)象時(shí)調(diào)用構(gòu)造函數(shù)一次,在調(diào)用結(jié)束時(shí)對(duì)象并不釋放,因此也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時(shí),才調(diào)用析構(gòu)函數(shù)。(2)如果定義的是局部自動(dòng)對(duì)象(例如在函數(shù)中定義對(duì)象),則459.4對(duì)象數(shù)組數(shù)組不僅可以由簡單變量組成(例如整型數(shù)組的每一個(gè)元素都是整型變量),也可以由對(duì)象組成(對(duì)象數(shù)組的每一個(gè)元素都是同類的對(duì)象)。對(duì)于已經(jīng)定義的類Student:Studentstu[3];//stu是對(duì)象數(shù)組在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。如果有3個(gè)元素,自動(dòng)調(diào)用3次構(gòu)造函數(shù)。若定義數(shù)組時(shí)要初始化,只能用構(gòu)造函數(shù):Studentstu[3]={Student(1001,18,87),Student(1002,19,90),Student(1001,17,85)};9.4對(duì)象數(shù)組數(shù)組不僅可以由簡單變量組成(例如整46如果構(gòu)造函數(shù)只有一個(gè)參數(shù),在定義數(shù)組時(shí)可以直接在等號(hào)后面的花括號(hào)內(nèi)提供實(shí)參。如Student::Student(intno){……};Studentstud[3]={60,70,78};//合法,3個(gè)實(shí)參分別傳遞

//給3個(gè)數(shù)組元素的構(gòu)造函數(shù)當(dāng)然,也可以:Studentstud[3]={Student(60),Student(70),Student(78)};如果構(gòu)造函數(shù)有多個(gè)參數(shù),則不能用在定義數(shù)組時(shí)直接提供所有實(shí)參的方法,要用構(gòu)造函數(shù)Student::Student(intno,ints1,ints2

){……};Studentstu[3]={Student(1001,18,87),Student(1002,19,90),Student(1001,17,85)};如果構(gòu)造函數(shù)只有一個(gè)參數(shù),在定義數(shù)組時(shí)可以直47有3個(gè)長方柱,其長、寬、高分別為:(1)3,2,1;(2)6,4,5;(3)2,2,2。求它們的體積。編一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);

//聲明帶參數(shù)的構(gòu)造函數(shù)

intvolume();//聲明計(jì)算體積的成員函數(shù)

private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在類外定義帶參數(shù)的構(gòu)造函數(shù){height=h;width=w;length=len;}有3個(gè)長方柱,其長、寬、高分別為:(1)3,2,1;(2)48intBox∷volume()//定義計(jì)算體積的成員函數(shù){return(height*width*length);}intmain(){Boxa[3]={Box(3,2,1),//用構(gòu)造函數(shù)初始化box[0]

Box(6,5,4),//用構(gòu)造函數(shù)初始化box[1]Box(2,2,2)//用構(gòu)造函數(shù)初始化box[2]};inti;for(i=0;i<3;i++)cout<<″Thevolumeofbox”<<i+1<<“is″<<a[i].volume()<<endl;return0;//結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)}intBox∷volume()49習(xí)題9.5

建立對(duì)象數(shù)組,內(nèi)放5個(gè)學(xué)生數(shù)據(jù)(學(xué)號(hào),成績),設(shè)立一個(gè)函數(shù)max,用指向?qū)ο蟮闹羔樧鳛楹瘮?shù)參數(shù),在max函數(shù)中找出成績最高者,輸出其學(xué)號(hào)。#include"iostream"usingnamespacestd;classStudent{private:intnum;floatscore;

public:Student(intnu,floatsco):num(nu),score(sco){};voiddisplay();friendvoidmax(Student*,int);//友元函數(shù)聲明};習(xí)題9.5建立對(duì)象數(shù)組,內(nèi)放5個(gè)學(xué)生數(shù)據(jù)(學(xué)號(hào),成績50voidStudent::display(){cout<<"學(xué)號(hào):"<<num<<"分?jǐn)?shù):"<<score<<endl;}voidmax(Student*ps,intn){inti,k;k=0;for(i=1;i<n;i++)if((*(ps+k)).score<(*(ps+i)).score)k=i;cout<<"成績最高者的學(xué)號(hào):"<<(*(ps+k)).num<<endl;}voidStudent::display()51intmain(){Studentstu[5]={Student(1001,75),Student(1002,78), Student(1003,95), Student(1004,60), Student(1005,62)};inti;for(i=0;i<5;i++)stu[i].display();max(stu,5);return0;}學(xué)號(hào):1001分?jǐn)?shù):75學(xué)號(hào):1002分?jǐn)?shù):78學(xué)號(hào):1003分?jǐn)?shù):95學(xué)號(hào):1004分?jǐn)?shù):60學(xué)號(hào):1005分?jǐn)?shù):62成績最高者的學(xué)號(hào):1003Pressanykeytocontinueintmain()學(xué)號(hào):1001分?jǐn)?shù):75529.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔?/p>

在建立對(duì)象時(shí),編譯系統(tǒng)會(huì)為每一個(gè)對(duì)象分配一定的存儲(chǔ)空間,以存放其成員。對(duì)象空間的起始地址就是對(duì)象的指針。可以定義一個(gè)指針變量,用來存放對(duì)象的指針。對(duì)于已經(jīng)定義的類Student:Student*p;//p是指向?qū)ο蟮闹羔樧兞縎tudentstu;//stu是對(duì)象p=&stu;//p指向了對(duì)象stu則:stu.num相當(dāng)于(*p).nump->相當(dāng)于(*p).namep->namestu.display()相當(dāng)于p->display()9.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔?39.5.2指向?qū)ο蟪蓡T的指針對(duì)象有地址,存放對(duì)象初始地址的指針變量就是指向?qū)ο蟮闹羔樧兞俊?duì)象中的成員也有地址,存放對(duì)象成員地址的指針變量就是指向?qū)ο蟪蓡T的指針變量。classTime{public:inthour;intminute;intsec;voidget_time();};Timet;對(duì)象t有存儲(chǔ)地址;t中的成員t.hour,t.minute,t.sec也有存儲(chǔ)地址??啥x指針變量指向這些成員。9.5.2指向?qū)ο蟪蓡T的指針對(duì)象有地址,存54指向?qū)ο髷?shù)據(jù)成員的指針定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同。例如Timet;Time*p;//定義指向?qū)ο蟮闹羔樧兞縤nt*p1;//定義指向整型數(shù)據(jù)的指針變量p=&t;//p指向了對(duì)象tp1=&t1.hour;//p1指向了對(duì)象中的成員hour//*p1就是t.hour指向?qū)ο髷?shù)據(jù)成員的指針552.指向?qū)ο蟪蓡T函數(shù)的指針定義指向?qū)ο蟪蓡T函數(shù)的指針變量的方法和定義指向普通函數(shù)的指針變量方法有所不同。成員函數(shù)與普通函數(shù)有一個(gè)最根本的區(qū)別:它是類中的一個(gè)成員。編譯系統(tǒng)要求在上面的賦值語句中,指針變量的類型必須與賦值號(hào)右側(cè)函數(shù)的類型相匹配,要求在以下3方面都要匹配:①函數(shù)參數(shù)的類型和參數(shù)個(gè)數(shù);②函數(shù)返回值的類型;③所屬的類。定義指向成員函數(shù)的指針變量應(yīng)該采用下面的形式:void(Time∷*p2)();//定義p2為指向Time類中公用成

//員函數(shù)的指針變量定義指向公用成員函數(shù)的指針變量的一般形式為

數(shù)據(jù)類型名(類名∷*指針變量名)(參數(shù)表列);2.指向?qū)ο蟪蓡T函數(shù)的指針56可以讓指針變量p2指向一個(gè)公用成員函數(shù),只需把公用成員函數(shù)的入口地址賦給p2即可。如p2=&Time∷get_time;使指針變量指向一個(gè)公用成員函數(shù)的一般形式為

指針變量名=&類名∷成員函數(shù)名;可以讓指針變量p2指向一個(gè)公用成員函數(shù),只需57例9.7有關(guān)對(duì)象指針的使用方法。#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);inthour;intminute;intsec;voidget_time();//聲明公有成員函數(shù)};Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime∷get_time()//定義公有成員函數(shù){cout<<hour<<″:″<<minute<<″:″<<sec<<endl;}例9.7有關(guān)對(duì)象指針的使用方法。58intmain(){Timet1(10,13,56);//定義Time類對(duì)象t1int*p1=&t1.hour;//定義指向整型數(shù)據(jù)的指針變量//p1,并使p1指向t1.hourcout<<*p1<<endl;//輸出p1所指的數(shù)據(jù)成員t1.hourt1.get_time();//調(diào)用對(duì)象t1的成員函數(shù)get_timeTime*p2=&t1;//定義指向Time類對(duì)象的指針變

//量p2,并使p2指向t1p2->get_time();//調(diào)用p2所指向?qū)ο?即t1)的//get_time函數(shù)void(Time∷*p3)();//定義指向Time類公用成員函數(shù)

//的指針變量p3p3=&Time∷get_time;//使p3指向Time類公用成員函數(shù)//get_time(t1.*p3)();//調(diào)用對(duì)象t1中p3所指的成員函數(shù)

//(即t1.get_time())}程序運(yùn)行結(jié)果為10(main函數(shù)第4行的輸出)10:13:56(main函數(shù)第5行的輸出)10:13:56(main函數(shù)第7行的輸出)10:13:56(main函數(shù)第10行的輸出)intmain()程序運(yùn)行結(jié)果為59this指針在類的每個(gè)成員函數(shù)中,都內(nèi)含一個(gè)系統(tǒng)定義好的特殊指針,名字是this,它總是指向當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象。例如,當(dāng)調(diào)用成員函數(shù)a.volume()時(shí),編譯系統(tǒng)就把對(duì)象a的起始地址賦給this指針,于是在成員函數(shù)引用數(shù)據(jù)成員時(shí),就按照this的指向找到對(duì)象a的數(shù)據(jù)成員。例如volume函數(shù)要計(jì)算height*width*length的值,實(shí)際上是執(zhí)行:

(this->height)*(this->width)*(this->length)由于當(dāng)前this指向a,因此相當(dāng)于執(zhí)行:

(a.height)*(a.width)*(a.length)這就計(jì)算出長方體a的體積。同樣如果有b.volume(),編譯系統(tǒng)就把對(duì)象b的起始地址賦給成員函數(shù)volume的this指針,顯然計(jì)算出來的是長方體b的體積。this指針在類的每個(gè)成員函數(shù)中,都內(nèi)含一個(gè)系統(tǒng)定60this指針是隱式使用的,它是作為參數(shù)被傳遞給成員函數(shù)的。本來,成員函數(shù)volume的定義如下:intBox∷volume(){return(height*width*length);}C++把它處理為intBox∷volume(Box*this){return(this->height*this->width*this->length);}即在成員函數(shù)的形參表列中增加一個(gè)this指針。在調(diào)用該成員函數(shù)時(shí),實(shí)際上是用以下方式調(diào)用的:a.volume(&a);將對(duì)象a的地址傳給形參this指針。然后按this的指向去引用其他成員。this指針是隱式使用的,它是作為參數(shù)被傳遞給成員函數(shù)的。本61需要說明:這些都是編譯系統(tǒng)自動(dòng)實(shí)現(xiàn)的,編程序者不必人為地在形參中增加this指針,也不必將對(duì)象a的地址傳給this指針。在需要時(shí)也可以顯式地使用this指針。例如在Box類的volume函數(shù)中,下面兩種表示方法都是合法的、相互等價(jià)的。return(height*width*length);//隱含使用this指針return(this->height*this->width*this->length);//顯式使用this指針

可以用*this表示被調(diào)用的成員函數(shù)所在的對(duì)象需要說明:這些都是編譯系統(tǒng)自動(dòng)實(shí)現(xiàn)的,編程序者不必人為地在62this指針classBox{public:Box(int,int,int);//聲明帶參數(shù)的構(gòu)造函數(shù)

intvolume();//聲明計(jì)算體積的成員函數(shù)

private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在類外定義帶參數(shù)的構(gòu)造函數(shù){this->height=h;//可省略為height=h;

this->width=w;//可省略為width=w;

this->length=len;//可省略為length=len;}this指針63intBox∷volume()//定義計(jì)算體積的成員函數(shù){return(this->height*this->width*this->length);}intmain(){Boxbox[3]={Box(3,2,1),//用構(gòu)造函數(shù)初始化box[0]Box(6,5,4),//用構(gòu)造函數(shù)初始化box[1]Box(2,2,2)//用構(gòu)造函數(shù)初始化box[2]};inti;for(i=0;i<3;i++)cout<<″Thevolumeofbox”<<i+1<<“is″<<box[i].volume()<<endl;return0;//結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)}當(dāng)調(diào)用box[i].volume()時(shí),this=&box[i]intBox∷volume()649.7對(duì)象的動(dòng)態(tài)建立和釋放有時(shí)人們希望在需要用到對(duì)象時(shí)才建立對(duì)象,在不需要用該對(duì)象時(shí)就撤銷它,釋放它所占的內(nèi)存空間以供別的數(shù)據(jù)使用。這樣可提高內(nèi)存空間的利用率。在第7章7.1.7節(jié)中介紹了用new運(yùn)算符動(dòng)態(tài)地分配內(nèi)存,用delete運(yùn)算符釋放這些內(nèi)存空間。這也適用于對(duì)象,可以用new運(yùn)算符動(dòng)態(tài)建立對(duì)象,用delete運(yùn)算符撤銷對(duì)象。9.7對(duì)象的動(dòng)態(tài)建立和釋放有時(shí)人們希望659.7對(duì)象的動(dòng)態(tài)建立和釋放對(duì)于已經(jīng)定義的類Student:Student*p;//p是指向?qū)ο蟮闹羔樧兞縫=newStudent;//p指向Student類的新對(duì)象p=newStudent(1001,“zhang”,87);//p指向Student類的新對(duì)象,用構(gòu)造函數(shù)初始化可以用指針訪問該新對(duì)象:

p->num,p->name,p->age,p->score當(dāng)不再使用對(duì)象時(shí),可撤銷對(duì)象(釋放內(nèi)存空間):

deletep;//一般在析構(gòu)函數(shù)中9.7對(duì)象的動(dòng)態(tài)建立和釋放對(duì)于已經(jīng)定義的類Studen66#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);

//聲明帶參數(shù)的構(gòu)造函數(shù)

~Box();

intvolume();//聲明計(jì)算體積的成員函數(shù)

private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen)//在類外定義帶參數(shù)的構(gòu)造函數(shù){height=h;width=w;length=len;}Box::~Box(){deletethis;};#include<iostream>67intBox∷volume()//定義計(jì)算體積的成員函數(shù){return(height*width*length);}intmain(){Box*bp[3];

inti,h,w,l;for(i=0;i<3;i++){cout<<“input:”;cin>>h>>w>>l;

bp[i]=newBox(h,w,l);}for(i=0;i<3;i++)cout<<″Thevolumeofbox”<<i+1<<“is″<<bp[i]->volume()<<endl;return0;//結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)}intBox∷volume()68在執(zhí)行new運(yùn)算時(shí),如果內(nèi)存量不足,無法開辟所需的內(nèi)存空間,目前大多數(shù)C++編譯系統(tǒng)都使new返回一個(gè)0指針值。只要檢測返回值是否為0,就可判斷分配內(nèi)存是否成功。Box*bp;

inth,w,l;cout<<“input:”;cin>>h>>w>>l;

bp=newBox(h,w,l);if(bp==NULL){cout<<“無內(nèi)存空間建立對(duì)象”;return0;}

……在執(zhí)行new運(yùn)算時(shí),如果內(nèi)存量不足,無法開辟所需的內(nèi)存空間,69第9章怎樣使用類和對(duì)象9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.2析構(gòu)函數(shù)9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序9.4對(duì)象數(shù)組9.5對(duì)象指針9.6共用數(shù)據(jù)的保護(hù)9.7對(duì)象的動(dòng)態(tài)建立和釋放9.8對(duì)象的賦值和復(fù)制9.9靜態(tài)成員9.10友元9.11類模板第9章怎樣使用類和對(duì)象9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行709.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.1.1對(duì)象的初始化在建立一個(gè)對(duì)象時(shí),常常需要作某些初始化的工作,例如對(duì)數(shù)據(jù)成員賦初值。如果一個(gè)數(shù)據(jù)成員未被賦值,則它的值是不可預(yù)知的。注意:類的數(shù)據(jù)成員是不能在聲明類時(shí)初始化的。classTime{public://聲明為公用成員

hour=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化minute=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化sec=0;//錯(cuò):類的數(shù)據(jù)成員不能在定義時(shí)初始化};

9.1利用構(gòu)造函數(shù)對(duì)類對(duì)象進(jìn)行初始化9.1.1對(duì)象的初71如果一個(gè)類中所有的成員都是公用的,則可以在定義對(duì)象時(shí)對(duì)數(shù)據(jù)成員進(jìn)行初始化。如classTime{public://聲明為公用成員

hour;minute;sec;};Timet1={14,56,30};//將t1初始化為14:56:30但是,如果數(shù)據(jù)成員是私有的,或者類中有private或protected的成員,就不能用這種方法初始化。

如果一個(gè)類中所有的成員都是公用的,則可以在定義對(duì)象時(shí)對(duì)數(shù)據(jù)成72structStudent//結(jié)構(gòu)聲明{intnum;charname[20];floatscore;};Studentstu1={1001,“zhangsan”,89};//對(duì)定義結(jié)構(gòu)體變量時(shí)同時(shí)初始化對(duì)結(jié)構(gòu)體,其成員默認(rèn)是publicstructStudent//結(jié)構(gòu)聲明{private:intnum;charname[20];floatscore;};Studentstu1={1001,“zhangsan”,89};//錯(cuò)錯(cuò):不能對(duì)私有成員初始化structStudent//結(jié)構(gòu)聲明定義結(jié)構(gòu)體變73Student類classStudent//類聲明{private:intnum;charname[20];floatscore;

public:voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;}}數(shù)據(jù)成員是私有的,本類外不能直接訪問Studentstu1={1001,”zhangsan”,89};//定義對(duì)象并初始化?不能!Student類classStudent//類聲74C++提供了構(gòu)造函數(shù)(constructor)來處理對(duì)象的初始化。構(gòu)造函數(shù)是一種特殊的成員函數(shù),與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名,以便編譯系統(tǒng)能識(shí)別它并把它作為構(gòu)造函數(shù)處理。它不具有任何類型,不返回任何值。構(gòu)造函數(shù)的功能是由用戶定義的,用戶根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。9.1.2構(gòu)造函數(shù)的作用C++提供了構(gòu)造函數(shù)(constructor)來75創(chuàng)建Student類的構(gòu)造函數(shù)#include<iostream>usingnamespacestd;classStudent{private:intnum;charname[20];floatscore;public:

Student(intn,char*p,floats);

//構(gòu)造函數(shù)的聲明voiddisplay();};Student::St

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論