類和對(duì)象的更多內(nèi)容_第1頁(yè)
類和對(duì)象的更多內(nèi)容_第2頁(yè)
類和對(duì)象的更多內(nèi)容_第3頁(yè)
類和對(duì)象的更多內(nèi)容_第4頁(yè)
類和對(duì)象的更多內(nèi)容_第5頁(yè)
已閱讀5頁(yè),還剩55頁(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)介

課件制作1主要內(nèi)容實(shí)例成員和靜態(tài)成員析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序?qū)ο笈c函數(shù)無(wú)名對(duì)象友元函數(shù)和友元類實(shí)例研究小結(jié)和作業(yè)課件制作22.1實(shí)例成員和靜態(tài)成員實(shí)例變量與類的特定對(duì)象聯(lián)系在一起;同一個(gè)類的不同對(duì)象,實(shí)例變量數(shù)據(jù)域是不同的,而且也不共享課件制作32.1實(shí)例成員和靜態(tài)成員靜態(tài)數(shù)據(jù)成員在不使用全局對(duì)象的情況下,如果希望一個(gè)類的所有對(duì)象共享某些數(shù)據(jù)成員,可以通過(guò)聲明該數(shù)據(jù)成員為靜態(tài)存儲(chǔ)類型來(lái)實(shí)現(xiàn)靜態(tài)數(shù)據(jù)成員是一種特殊的數(shù)據(jù)成員,它以關(guān)鍵字static開頭靜態(tài)數(shù)據(jù)成員的值在各對(duì)象中是一樣的,它為各對(duì)象所共有,而不只屬于某個(gè)對(duì)象的成員classCircle{public:Circle();Circle(doubler);doublegetArea();intgetNumberOfObjects();private:doubleradius;

staticintnumberOfObjects;};課件制作42.1實(shí)例成員和靜態(tài)成員//file:Circle.hclassCircle{public:Circle();Circle(double);doublegetArea();doublegetRadius();voidsetRadius(double);intgetNumberOfObjects();private:doubleradius;

staticintnumberOfObjects;};//file:Circle.cpp#include"Circle.h"constdoublePI=3.1415926;intCircle::numberOfObjects=0;//ConstructacircleobjectCircle::Circle(){radius=1;

numberOfObjects++;}//ConstructacircleobjectCircle::Circle(doubleradius){this->radius=radius;

numberOfObjects++;}//ReturntheareaofthiscircledoubleCircle::getArea(){returnradius*radius*PI;}//ReturntheradiusofthiscircledoubleCircle::getRadius(){returnradius;}//SetanewradiusvoidCircle::setRadius(doubleradius){this->radius=(radius>=0)?radius:0;}//ReturnthenumberofcircleobjectsintCircle::getNumberOfObjects(){returnnumberOfObjects;}靜態(tài)成員初始化靜態(tài)成員訪問(wèn)課件制作52.1實(shí)例成員和靜態(tài)成員//file:CircleTest.cpp#include<iostream>usingnamespacestd;#include"Circle.h"intmain(){Circlecircle1;cout<<"Theareaofthecircleofradius"<<circle1.getRadius()<<"is"<<circle1.getArea()<<endl;cout<<"Numberofcircleobjectscreated:"<<circle1.getNumberOfObjects()<<endl;Circlecircle2(5.0);cout<<"Theareaofthecircleofradius"<<circle2.getRadius()<<"is"<<circle2.getArea()<<endl;cout<<"Numberofcircleobjectscreated:"<<circle2.getNumberOfObjects()<<endl;circle1.setRadius(3.3);cout<<"Theareaofthecircleofradius"<<circle1.getRadius()<<"is"<<circle1.getArea()<<endl;cout<<"circle1.getNumberOfObjects()returns"<<circle1.getNumberOfObjects()<<endl;cout<<"circle2.getNumberOfObjects()returns"<<circle2.getNumberOfObjects()<<endl;return0;}課件制作62.1實(shí)例成員和靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是在程序編譯時(shí)被分配空間,到程序結(jié)束時(shí)才釋放空間靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類體外進(jìn)行初始化使用靜態(tài)數(shù)據(jù)成員的目的是節(jié)約空間,提高效率靜態(tài)數(shù)據(jù)成員與實(shí)例的關(guān)系靜態(tài)數(shù)據(jù)成員在內(nèi)存中只占一份空間,每個(gè)對(duì)象都可以引用這個(gè)靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員的值對(duì)所有對(duì)象都是一樣的;如果改變它的值,則在各對(duì)象中這個(gè)數(shù)據(jù)成員的值都同時(shí)改變靜態(tài)數(shù)據(jù)成員不屬于某一個(gè)對(duì)象,在為對(duì)象所分配的空間中不包括靜態(tài)數(shù)據(jù)成員所占的空間;靜態(tài)數(shù)據(jù)成員是在所有對(duì)象之外單獨(dú)開辟空間。靜態(tài)數(shù)據(jù)成員不隨對(duì)象的建立而分配空間,也不隨對(duì)象的撤銷而釋放。課件制作72.1實(shí)例成員和靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員初始化的一般形式為:數(shù)據(jù)類型類名∷靜態(tài)數(shù)據(jù)成員名=初值;不必在初始化語(yǔ)句中加static公有靜態(tài)數(shù)據(jù)成員既可以通過(guò)對(duì)象名引用,也可以通過(guò)類名來(lái)引用有了靜態(tài)數(shù)據(jù)成員,同一個(gè)類各對(duì)象之間的數(shù)據(jù)有了溝通的渠道,實(shí)現(xiàn)數(shù)據(jù)共享,因此可以不使用全局變量。全局變量破壞了封裝的原則,不符合面向?qū)ο蟪绦虻囊骾ntCircle::numberOfObjects=0;Circlecircle2(5.0);cout<<"Numberofcircleobjectscreated:"<<circle2.numberOfObjects<<endl;cout<<"Numberofcircleobjectscreated:"<<Circle::NumberOfObjects<<endl;課件制作82.1實(shí)例成員和靜態(tài)成員靜態(tài)成員函數(shù)成員函數(shù)也可以定義為靜態(tài)的,在類中聲明函數(shù)的前面加static就成了靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)是類的一部分,而不是對(duì)象的一部分靜態(tài)成員函數(shù)的作用不是為了對(duì)象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員在C++程序中,靜態(tài)成員函數(shù)主要用來(lái)訪問(wèn)靜態(tài)數(shù)據(jù)成員,而不訪問(wèn)非靜態(tài)成員classCircle{public:Circle();Circle(double);doublegetArea();doublegetRadius();voidsetRadius(double);

staticintgetNumberOfObjects();private:doubleradius;

staticintnumberOfObjects;};課件制作92.1實(shí)例成員和靜態(tài)成員//靜態(tài)成員的應(yīng)用//file:Student.h#include<string>usingnamespacestd;classStudent//定義Student類{public:Student(intn,stringname,floats):num(n),strName(name),score(s){}//定義構(gòu)造函數(shù)

voidTotal();

staticfloatAverage();//聲明靜態(tài)成員函數(shù)private:intnum;stringstrName;floatscore;

staticfloatsum;//靜態(tài)數(shù)據(jù)成員

staticintcount;//靜態(tài)數(shù)據(jù)成員};課件制作102.1實(shí)例成員和靜態(tài)成員//Student.cpp#include"Student.h"http://對(duì)靜態(tài)數(shù)據(jù)成員初始化floatStudent::sum=0;intStudent::count=0;//非靜態(tài)成員函數(shù)實(shí)現(xiàn)voidStudent::Total(){

sum+=score;//累加總分

count++;//累計(jì)已統(tǒng)計(jì)的人數(shù)}//定義靜態(tài)成員函數(shù)floatStudent::Average(){return(sum/count);}課件制作112.1實(shí)例成員和靜態(tài)成員//StudentTest.cpp#include<iostream>usingnamespacestd;#include"Student.h"intmain(){//定義對(duì)象數(shù)組并初始化

Studentstud[3]={Student(1001,"aaa",70),Student(1002,"bbb",78),Student(1005,"ccc",98)};

intn;cout<<"Pleaseinputthenumberofstudents:";cin>>n;//輸入需要求前面多少名學(xué)生的平均成績(jī)

for(inti=0;i<n;i++)//調(diào)用n次total函數(shù)

stud[i].Total();cout<<"Theaveragescoreof"<<n<<"studentsis"<<Student::Average()<<endl;//調(diào)用靜態(tài)成員函數(shù)

return0;}課件制作122.1實(shí)例成員和靜態(tài)成員靜態(tài)成員函數(shù)在Student類中定義了兩個(gè)靜態(tài)數(shù)據(jù)成員sum(總分)和count(累計(jì)需要統(tǒng)計(jì)的學(xué)生人數(shù)),這兩個(gè)數(shù)據(jù)成員的值是需要進(jìn)行累加的,它們并不是只屬于某一個(gè)對(duì)象元素,而是由各對(duì)象元素共享Total()是公有的成員函數(shù),可以引用本對(duì)象中的一般數(shù)據(jù)成員(非靜態(tài)數(shù)據(jù)成員),也可以引用類中的靜態(tài)數(shù)據(jù)成員Average()是靜態(tài)成員函數(shù),它可以直接引用私有的靜態(tài)數(shù)據(jù)成員(不必加類名或?qū)ο竺?,函數(shù)返回成績(jī)的平均值主程序中引用Total()函數(shù)要加對(duì)象名,引用靜態(tài)成員函數(shù)Average()函數(shù)要用類名或?qū)ο竺绻粚verage函數(shù)定義為靜態(tài)成員函數(shù)行不行?程序能否通過(guò)編譯?為什么要用靜態(tài)成員函數(shù)?請(qǐng)分析其理由課件制作132.1實(shí)例成員和靜態(tài)成員靜態(tài)成員函數(shù)如果在類外調(diào)用公用的靜態(tài)成員函數(shù),要用類名和域運(yùn)算符“∷”靜態(tài)成員函數(shù)原則上不允許引用本類非靜態(tài)數(shù)據(jù)成員cout<<Student∷Average()<<endl;//調(diào)用靜態(tài)成員函數(shù)課件制作142.2析構(gòu)函數(shù)析構(gòu)函數(shù)(destructor)也是一個(gè)特殊的成員函數(shù),其名字是類名的前面加一個(gè)“~”符號(hào)析構(gòu)函數(shù)沒(méi)有返回類型和參數(shù)當(dāng)對(duì)象銷毀時(shí),析構(gòu)函數(shù)被自動(dòng)調(diào)用它不能被重載。一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但只能有一個(gè)析構(gòu)函數(shù)如果程序員沒(méi)有顯式定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)為每一個(gè)類定義一個(gè)默認(rèn)的析構(gòu)函數(shù),但它只是徒有析構(gòu)函數(shù)的名稱和形式,實(shí)際上什么操作都不進(jìn)行一般情況下,類的設(shè)計(jì)者應(yīng)當(dāng)在聲明類的同時(shí)定義析構(gòu)函數(shù),以指定如何完成“清理”的工作classCircle{public:Circle();Circle(double);

~Circle();doublegetArea();doublegetRadius();voidsetRadius(double);staticintgetNumberOfObjects();private:doubleradius;staticintnumberOfObjects;};俺就是析構(gòu)函數(shù)課件制作152.2析構(gòu)函數(shù)//file:Student.h//聲明Student類classStudent{public:

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

Student();Student(intn,charnam[20]);

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

~Student();

voidDisplay();private:intnum;

char*pName;};//file:Student.cpp#include<iostream>usingnamespacestd;#include"Student.h"http://Student類實(shí)現(xiàn)Student::Student(intn,charname[20])//定義構(gòu)造函數(shù){num=n;pName=newchar[20];strcpy(pName,name);}Student::~Student()//定義析構(gòu)函數(shù){if(pName!=NULL)deletepName;}voidStudent::Display(){cout<<"No:"<<num<<",Name:"<<pName<<endl;}課件制作162.2析構(gòu)函數(shù)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。具體地說(shuō)如果出現(xiàn)以下幾種情況,程序就會(huì)執(zhí)行析構(gòu)函數(shù):如果在一個(gè)函數(shù)中定義了一個(gè)對(duì)象(它是自動(dòng)局部對(duì)象),當(dāng)這個(gè)函數(shù)被調(diào)用結(jié)束時(shí),對(duì)象應(yīng)該釋放,在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù)如果定義了一個(gè)全局對(duì)象,則在程序的流程離開其作用域時(shí)(如main函數(shù)結(jié)束或調(diào)用exit函數(shù))時(shí),調(diào)用該全局對(duì)象的析構(gòu)函數(shù)如果用new運(yùn)算符動(dòng)態(tài)地建立了一個(gè)對(duì)象,當(dāng)用delete運(yùn)算符釋放該對(duì)象時(shí),先調(diào)用該對(duì)象的析構(gòu)函數(shù)。它撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作,使這部分內(nèi)存可以被程序分配給新對(duì)象使用課件制作172.2析構(gòu)函數(shù)#include<string>#include<iostream>usingnamespacestd;//聲明Student類classStudent{public:Student(intn,stringname)//定義構(gòu)造函數(shù)

{num=n;strName=name;cout<<"Constructorcalled."<<endl;//輸出有關(guān)信息

}

~Student()//定義析構(gòu)函數(shù)

{cout<<"Destructorcalled:"<<strName<<endl;//輸出有關(guān)信息

}voidDisplay(){cout<<num<<"\t"<<strName<<endl;}private:intnum;stringstrName;};intmain(){Studentst1(10,"Wang_li");//建立對(duì)象st1st1.Display();//輸出學(xué)生1的數(shù)據(jù)

Studentst2(11,"Zhang_fun");//定義對(duì)象st2st2.Display();//輸出學(xué)生2的數(shù)據(jù)

return0;}課件制作182.3拷貝構(gòu)造函數(shù)也是一種特殊的構(gòu)造函數(shù),每個(gè)類可以有一個(gè)拷貝構(gòu)造函數(shù)作用:創(chuàng)建一個(gè)對(duì)象并用另一個(gè)對(duì)象的數(shù)據(jù)初始化新建對(duì)象拷貝構(gòu)造函數(shù)的函數(shù)聲明為:類名(類名&對(duì)象名)//file:Circle.hclassCircle{public:Circle();Circle(doubler);

Circle(Circle&cr);~Circle();doublegetRadius();doublegetArea();

private:doubleradius;};//file:Circle.cpp#include<iostream>usingnamespacestd;#include"Circle.h"constdoublePI=3.14;Circle::Circle(){radius=1;}Circle::Circle(doubler){radius=r;}Circle::Circle(Circle&cr){*this=cr;}Circle::~Circle(){cout<<"Des:"<<radius<<endl;}doubleCircle::getRadius(){returnradius;}doubleCircle::getArea(){returnradius*radius*PI;}//file:CircleTest.cpp#include<iostream>usingnamespacestd;#include"Circle.h"intmain(){Circlecr1,cr2(5);

Circlecr3(cr1),cr4(cr2);cout<<"cr1:"<<cr1.getRadius()<<endl;cout<<"cr2:"<<cr2.getRadius()<<endl;cout<<"cr3:"<<cr3.getRadius()<<endl;cout<<"cr4:"<<cr4.getRadius()<<endl;return0;}課件制作192.3拷貝構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)類定義時(shí),如果程序員未提供拷貝構(gòu)造函數(shù),則C++編譯器自動(dòng)提供一個(gè)拷貝構(gòu)造函數(shù),稱為默認(rèn)拷貝構(gòu)造函數(shù)默認(rèn)拷貝函數(shù)工作方式對(duì)于普通數(shù)據(jù)域成員,簡(jiǎn)單地將參數(shù)對(duì)象的每個(gè)數(shù)據(jù)域復(fù)制給新建對(duì)象中相應(yīng)的數(shù)據(jù)域,產(chǎn)生數(shù)據(jù)域的副本;對(duì)于類對(duì)象成員,則調(diào)用其拷貝構(gòu)造函數(shù)或默認(rèn)拷貝構(gòu)造函數(shù)課件制作202.3拷貝構(gòu)造函數(shù)#include<iostream>#include<string>usingnamespacestd;//類StudentclassStudent{public:Student(char*pName="noname"){cout<<"Constructingnewstudent"<<pName<<endl;strncpy(name,pName,sizeof(name));name[sizeof(name)-1]='\0';}

Student(Student&s){cout<<"Constructingcopyof"<<<<endl;strcpy(name,"copyof");strcat(name,);}~Student(){cout<<"Destructing"<<name<<endl;}private:charname[40];};//類TutorclassTutor{public:Tutor(Student&s):student(s){cout<<"Constructingtutor\n";}private:

Studentstudent;};voidfn(Tutortutor){cout<<"Infunctionfn()\n";}intmain(){Studentst("Randy");Tutortt(st);cout<<"Callingfn()\n";fn(tt);cout<<"Returnedfromfn()\n";return0;}ConstructingnewstudentRandyConstructingcopyofRandyConstructingtutorConstructingcopyofcopyofRandy課件制作212.3拷貝構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)存在的問(wèn)題#include<iostream>usingnamespacestd;classPerson{public:Person(char*pN){cout<<"Constructing"<<pN<<endl;pName=newchar[strlen(pN)+1];if(pName!=NULL)strcpy(pName,pN);}

~Person(){cout<<"Destructing"<<pName<<endl;if(pName!=NULL)deletepName;}private:

char*pName;};intmain(){

Personp1("Randy");//默認(rèn)拷貝構(gòu)造函數(shù)

Personp2=p1;//即Personp2(p1);

return0;}課件制作222.3拷貝構(gòu)造函數(shù)默認(rèn)拷貝構(gòu)造函數(shù)—淺拷貝默認(rèn)拷貝構(gòu)造函數(shù)或賦值運(yùn)算符進(jìn)行對(duì)象賦值的方式對(duì)象析構(gòu)時(shí)產(chǎn)生內(nèi)存釋放錯(cuò)誤默認(rèn)拷貝構(gòu)造函數(shù)不能應(yīng)用于數(shù)據(jù)域是一個(gè)指向其他對(duì)象指針的情形自定義拷貝構(gòu)造函數(shù)—深拷貝pName堆p1拷貝前堆pNamep1pNamep2拷貝后課件制作232.3拷貝構(gòu)造函數(shù)//file:Person..hclassPerson{public:Person(char*pN);

Person(Person&p);~Person();private:char*pName;};//file:Person.cpp#include<iostream>usingnamespacestd;#include"Person.h"Person::Person(char*pN){cout<<"Constructing"<<pN<<endl;pName=newchar[strlen(pN)+1];if(pName!=NULL)strcpy(pName,pN);}Person::Person(Person&p){cout<<"Copying"<<p.pName<<"intoitsownblock!\n";pName=newchar[strlen(p.pName)+1];if(pName!=NULL)strcpy(pName,p.pName);}Person::~Person(){cout<<"Destructing"<<pName<<endl;if(pName!=NULL)deletepName;}//file:PersonTest.cpp#include"Person.h"intmain(){Personp1("Randy");Personp2=p1;//即Personp2(p1);

return0;}課件制作242.3拷貝構(gòu)造函數(shù)自定義拷貝構(gòu)造函數(shù)—深拷貝堆內(nèi)存是最常用的需要拷貝構(gòu)造函數(shù)的資源如果程序員聲明的類需要析構(gòu)函數(shù)來(lái)析構(gòu)資源,則它也需要一個(gè)深拷貝構(gòu)造函數(shù)pName堆p1拷貝前堆pNamep1pNamep2拷貝后堆課件制作252.3拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)的應(yīng)用對(duì)象賦值多個(gè)對(duì)象之間可以互相賦值,或者說(shuō)一個(gè)對(duì)象的值可以賦給另一個(gè)同類的對(duì)象對(duì)象之間的賦值是通過(guò)賦值運(yùn)算符“=”進(jìn)行的,其實(shí)質(zhì)是通過(guò)拷貝構(gòu)造函數(shù)來(lái)完成對(duì)象賦值的一般形式為:對(duì)象名1=對(duì)象名2;對(duì)象名1和對(duì)象名2必須屬于同一個(gè)類Studentst1,st2;//定義兩個(gè)同類的對(duì)象┆st2=st1;//將st1賦給st2課件制作262.3拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)的應(yīng)用對(duì)象的復(fù)制用一個(gè)已有的對(duì)象快速地復(fù)制出多個(gè)完全相同的對(duì)象,這就是對(duì)象的復(fù)制機(jī)制目的:需要用到多個(gè)完全相同的對(duì)象,將對(duì)象在某一瞬時(shí)的狀態(tài)保留下來(lái)對(duì)象復(fù)制的一般形式為:類名對(duì)象2(對(duì)象1);含義用對(duì)象1復(fù)制出對(duì)象2Studentst1;Studentst2(st1);//其作用是用已有的對(duì)象st1去克隆出一個(gè)新對(duì)象st2Studentst3=st1;課件制作272.4構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序構(gòu)造對(duì)象的順序創(chuàng)建對(duì)象的必經(jīng)途徑是調(diào)用構(gòu)造函數(shù)構(gòu)造對(duì)象的先后順序不同,直接影響程序執(zhí)行的先后順序,導(dǎo)致不同的運(yùn)行結(jié)果局部和靜態(tài)對(duì)象,以聲明的順序構(gòu)造局部對(duì)象和靜態(tài)對(duì)象是指塊作用域和文件作用域的對(duì)象聲明順序與在程序中出現(xiàn)的順序一致#include<iostream>usingnamespacestd;intmain(){intm=6;if(m==5)

gotoabc;intn=0;abc:cout<<"m="<<m<<",n="<<n<<endl;}課件制作282.4構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序構(gòu)造對(duì)象的順序靜態(tài)對(duì)象只構(gòu)造一次文件作用域的靜態(tài)對(duì)象在主函數(shù)開始運(yùn)行前全部構(gòu)造完成塊作用域的靜態(tài)對(duì)象則在首次進(jìn)入到定義該靜態(tài)對(duì)象的函數(shù)時(shí)進(jìn)行構(gòu)造#include<iostream>#include<string>usingnamespacestd;classSmallOne{public:SmallOne(intsma){so=sma;cout<<"Smalloneconstructingwithavalueof"<<sma<<endl;}private:intso;};voidfn(intn){

staticSmallOnesm(n);//塊作用域

cout<<"Infunctionfnwithn="<<n<<endl;}staticSmallOnesm2(10);//文件作用域intmain(){fn(20);fn(30);return0;}課件制作292.4構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序構(gòu)造對(duì)象的順序全局對(duì)象主函數(shù)main()之前按聲明順序被構(gòu)造慎重使用全局對(duì)象,以免其構(gòu)造函數(shù)出現(xiàn)錯(cuò)誤不易調(diào)試全局對(duì)象構(gòu)造函數(shù)存在錯(cuò)誤時(shí)的解決辦法將全局對(duì)象先作為局部對(duì)象來(lái)調(diào)試在所有懷疑有錯(cuò)的全局對(duì)象構(gòu)造函數(shù)中增加輸出語(yǔ)句在多文件程序結(jié)構(gòu)中,使用全局對(duì)象有可能出現(xiàn)不可預(yù)料的錯(cuò)誤課件制作302.4構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序//file:student.h#include<iostream>usingnamespacestd;//類StudentclassStudent{public:Student(intd):sid(d){}voidDisplay(){cout<<"StudentID"<<sid<<endl;}public:intsid;};//類TutorclassTutor{public:Tutor(Student&s){tid=s.id;}voidDisplay(){cout<<"TutorID"<<tid<<endl;}private:inttid;};//file:CH2_81.cpp#include"student.h"Students(1234);//全局變量//file:CH2_82.cpp#include"student.h"externStudents;Tutort(s);//全局變量intmain(){s.Display();t.Display();return0;}課件制作312.4構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序構(gòu)造對(duì)象的順序類的數(shù)據(jù)成員以其在類中聲明的順序構(gòu)造#include<iostream>usingnamespacestd;classA{public:A(intj):age(j),num(age+1){}voidDisplay(){cout<<"age:"<<age<<",num:"<<num<<endl;}private:

intnum;intage;};intmain(){Asa(15);sa.Display();return0;}課件制作322.4構(gòu)造函數(shù)和析構(gòu)函數(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)用,如圖所示:課件制作332.5對(duì)象與函數(shù)對(duì)象作為函數(shù)參數(shù)對(duì)象可以作為實(shí)參傳遞給函數(shù),既可使用按值方式也可按引用方式//file:Circle.hclassCircle{public:Circle();Circle(double);doublegetArea();doublegetRadius();voidsetRadius(double);private:doubleradius;};//file:Circle.cpp#include"Circle.h"constdoublePI=3.1419;Circle::Circle()//Constructacircleobject{radius=1;}Circle::Circle(doublenewRadius)//Constructacircleobject{radius=newRadius;}voidCircle::setRadius(doublenewRadius)//Setanewradius{radius=(newRadius>=0)?newRadius:0;}

doubleCircle::getRadius()//Returntheradiusofthiscircle{returnradius;}doubleCircle::getArea()//Returntheareaofthiscircle{returnradius*radius*PI;}課件制作342.5對(duì)象與函數(shù)//file:CircleTest.cpp#include<iostream>usingnamespacestd;#include"Circle.h"voidprintCircle(Circlec){cout<<"Theareaofthecircleof"<<c.getRadius()<<"is"<<c.getArea()<<endl;}intmain(){CirclemyCircle(5.0);

printCircle(myCircle);return0;}課件制作352.5對(duì)象與函數(shù)//file:CircleTest.cpp#include<iostream>usingnamespacestd;#include"Circle.h"voidprintCircle(Circle&c){cout<<"Theareaofthecircleof"<<c.getRadius()<<"is"<<c.getArea()<<endl;}intmain(){CirclemyCircle(5.0);

printCircle(myCircle);return0;}課件制作362.5對(duì)象與函數(shù)//file:CircleTest.cpp#include<iostream>usingnamespacestd;#include"Circle.h"voidprintCircle(Circle*pCircle){cout<<"Theareaofthecircleof"<<pCircle->getRadius()<<"is"<<pCircle->getArea()<<endl;}intmain(){CirclemyCircle(5.0);

printCircle(&myCircle);return0;}課件制作372.5對(duì)象與函數(shù)對(duì)象作為函數(shù)返回值當(dāng)函數(shù)返回一個(gè)對(duì)象時(shí)要?jiǎng)?chuàng)建一個(gè)臨時(shí)對(duì)象以存放返回的對(duì)象StudentfnCreate(){Studentst("Randy");…

returnst;}intmain(){Students;

s=fnCreate();return0;}st臨時(shí)對(duì)象s放入取出函數(shù)main()棧區(qū)函數(shù)fnCreate()棧區(qū)放入和取出實(shí)際是執(zhí)行拷貝構(gòu)造函數(shù)課件制作382.5對(duì)象與函數(shù)#include<iostream>#include<string>usingnamespacestd;classStudent//類Student{public:Student(char*pName="noname"){cout<<"Constructingnewstudent"<<pName<<endl;strncpy(name,pName,sizeof(name));name[sizeof(name)-1]='\0';}Student(Student&s){cout<<"Constructingcopyof"<<<<endl;strcpy(name,"copy_of_");strcat(name,);}~Student(){cout<<"Destructing"<<name<<endl;}private:charname[40];};StudentfnCreate(){Studentst("Randy");returnst;}intmain(){Students;s=fnCreate();return0;}ConstructingnewstudentnonameConstructingnewstudentRandy課件制作392.6無(wú)名對(duì)象無(wú)名對(duì)象的產(chǎn)生:直接調(diào)用構(gòu)造函數(shù)產(chǎn)生無(wú)名對(duì)象的使用:函數(shù)實(shí)參,構(gòu)造新對(duì)象,初始化一個(gè)引用的聲明StudentfnCreate(){…returnStudent("Randy");//此處為無(wú)名對(duì)象}voidfnCreate(Student&st);intmain(){

fnCreate(Student(“Danny”));//函數(shù)參數(shù)

Studentst=Student("Jenny");//初始化對(duì)象定義

Student&refs=Student("Randy");//初始化引用

…}課件制作402.7友元函數(shù)和友元類一個(gè)類的私有成員不能被外部程序訪問(wèn)如果有時(shí)允許一些可信的函數(shù)或類訪問(wèn)一個(gè)類的私有成員會(huì)使編程更方便—友元函數(shù)和友元類友元函數(shù)和友元類的聲明:friend友元函數(shù)課件制作412.7友元函數(shù)和友元類#include<iostream>usingnamespacestd;classTime{public:Time(inth,intm,ints);

private://以下數(shù)據(jù)是私有數(shù)據(jù)成員

inthour;intminute;intsec;};……voidfnDisplay(Time&t)//普通函數(shù){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}……friendvoidfnDisplay(Time&t);類Time的友元函數(shù),形參t是Time類對(duì)象的引用聲明display函數(shù)為Time類的友元函數(shù)課件制作422.7友元函數(shù)和友元類友元函數(shù)友元函數(shù)是能夠訪問(wèn)類中私有成員的非成員函數(shù)友元函數(shù)可以是普通函數(shù),也可以是其它類的成員函數(shù)友元函數(shù)是普通函數(shù)要求設(shè)計(jì)一普通函數(shù)fnDisplay,可以訪問(wèn)類Time的私有成員//file:Time.hclassTime{public:Time(inth,intm,ints);

friendvoidfnDisplay(Time&t);//聲明fnDisplay函數(shù)為Time類的友元函數(shù)

private://以下數(shù)據(jù)是私有數(shù)據(jù)成員

inthour;intminute;intsec;};課件制作432.7友元函數(shù)和友元類//file:Time.cpp#include<iostream>usingnamespacestd;#include"Time.h"http://構(gòu)造函數(shù),給hour,minute,sec賦初值Time::Time(inth,intm,ints){hour=h;minute=m;sec=s;}//類Time的友元函數(shù),形參t是Time類對(duì)象的引用voidfnDisplay(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}由于聲明了fnDisplay是Time類的friend函數(shù),可以引用Time中的私有成員hour,minute,sec//file:TimeTest.cpp#include"Time.h"intmain(){Timet1(10,13,56);

//調(diào)用display函數(shù),實(shí)參t1是Time類對(duì)象

fnDisplay(t1);return0;}課件制作442.7友元函數(shù)和友元類友元函數(shù)友元函數(shù)是其它類的成員函數(shù)現(xiàn)有兩個(gè)類Date和Time,要求給Time類設(shè)計(jì)一成員函數(shù)DisplayT,用于顯示日期和時(shí)間信息//定義Time類classTime{public:Time(inth,intm,ints);

voidDisplay();private:inthour;intminute;intsec;};//聲明Date類classDate{public:Date(inty,intm,intd);

voidDisplay();private:intmonth;intday;intyear;};課件制作452.7友元函數(shù)和友元類//file:DateTime.hclassDate;//由于Date的聲明在Time類之后,而在Time類中需要使用Date類,因此要進(jìn)行類型聲明classTime//聲明Time類{public:Time(inth,intm,ints);

voidDisplayT(Date&d);//成員函數(shù),形參是Date類對(duì)象的引用private:inthour;intminute;intsec;};classDate//聲明Date類{public:Date(inty,intm,intd);voidDisplay();

friendvoidTime::DisplayT(Date&d);//聲明Time中的DisplayT函數(shù)為該類友元成員函數(shù)private:intmonth;intday;intyear;};

課件制作462.7友元函數(shù)和友元類//file:DateTime.cpp#include<iostream>usingnamespacestd;#include"DateTime.h"http://Time類的實(shí)現(xiàn)Time::Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime::DisplayT(Date&d){

cout<<d.year<<"/"<<d.month<<"/"<<d.day<<"\t";cout<<hour<<":"<<minute<<":"<<sec<<endl;}//Date類的實(shí)現(xiàn)Date::Date(inty,intm,intd){year=y;month=m;day=d;}voidDate::Display(){cout<<year<<"/"<<month<<"/"<<day<<endl;}//file:DateTimeTest.cpp#include"DateTime.h"intmain(){Timet1(10,13,56);//定義Time類對(duì)象t1Dated1(12,25,2005);//定義Date類對(duì)象d1d1.Display();

t1.DisplayT(d1);return0;}課件制作472.7友元函數(shù)和友元類友元類不僅可以將一個(gè)函數(shù)聲明為一個(gè)類的“朋友”,而且可以將一個(gè)類(例如B類)聲明為另一個(gè)類(例如A類)的“朋友”,此時(shí)B類就是A類的友元類友元類B中的所有函數(shù)都是類A的友元函數(shù),可以訪問(wèn)類A中的所有成員聲明友元類的一般形式為:friendclass類名;課件制作482.7友元函數(shù)和友元類//file:DateTime.hclassDate;//由于Date的聲明在類Time之后,而在類Time中需要使用類Date,因此要進(jìn)行類型聲明classTime//聲明Time類{public:Time(inth,intm,ints);

voidDisplayT(Date&d);//成員函數(shù),形參是Date類對(duì)象的引用private:inthour;intminute;intsec;};classDate//聲明Date類{public:Date(inty,intm,intd);private:

voidDisplay();

friendclassTime;//聲明類Time為該類的友元類private:intmonth;intday;intyear;};

課件制作492.7友元函數(shù)和友元類//file:DateTime.cpp#include<iostream>usingnamespacestd;#include"DateTime.h"http://Time類的實(shí)現(xiàn)Time::Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime::DisplayT(Date&d){

d.Display();cout<<hour<<":"<<minute<<":"<<sec<<endl;}//Date類的實(shí)現(xiàn)Date::Date(inty,intm,intd){year=y;month=m;day=d;}voidDate::Display(){cout<<year<<"/"<<month<<"/"<<day<<endl;}//file:DateTimeTest.cpp#include"DateTime.h"intmain(){Timet1(10,13,56);//定義Time類對(duì)象t1Dated1(12,25,2005);//定義Date類對(duì)象d1t1.DisplayT(d1);return0;}課件制作502.7友元函數(shù)和友元類關(guān)于友元,有兩點(diǎn)需要說(shuō)明:友元的關(guān)系是單向的而不是雙向的友元的關(guān)系不能傳遞考慮到安全性,一般并不把整個(gè)類聲明為友元類,而只將確實(shí)有需要的成員函數(shù)聲明為友元函數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)基本原則是封裝性和信息隱蔽,而友元卻可以訪問(wèn)其他類中的私有成員,這是對(duì)封裝原則的一個(gè)小的破壞使用友元有助于數(shù)據(jù)共享,能提高程序的效率,在使用友元時(shí),要注意到它的副作用,不要過(guò)多地使用友元,只有在使用它能使程序精煉,并能大大提高程序的效率時(shí)才用友元課件制作512.8實(shí)例研究實(shí)例一:C++向量類(vectorclass)向量是由數(shù)組推廣而來(lái),她存儲(chǔ)具有相同數(shù)據(jù)類型的一組元素與數(shù)組一樣使用范圍

0~n-1

內(nèi)的下標(biāo)訪問(wèn)其元素,其中n為向量大小與數(shù)組不同,向量中的數(shù)據(jù)集可以在序列尾部動(dòng)態(tài)增長(zhǎng)或收縮在向量中間位置的插入和刪除的操作效率不高當(dāng)程序需要?jiǎng)討B(tài)序列和通過(guò)元素位置直接訪問(wèn)元素時(shí),可選擇向量作為數(shù)據(jù)結(jié)構(gòu)vector是C++標(biāo)準(zhǔn)模板庫(kù)中的部分內(nèi)容,是一個(gè)多功能的、能夠操作多種數(shù)據(jù)結(jié)構(gòu)和算法的模板類和函數(shù)庫(kù)課件制作522.8實(shí)例研究實(shí)例一:C++向量類(vectorclass)vector是一個(gè)容器,它能夠存放各種類型的對(duì)象,簡(jiǎn)單地說(shuō),vector是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,可以動(dòng)態(tài)改變大小為了使用vector必須包含相關(guān)的頭文件:#include<vector>vector<datatype>----------------------------------------------+vector<datatype>()+push_back(element:datatype):void+pop_back():void+size():unsinedint+at(index:int):datatype+empty():bool+clear():void+swap(v2:vector):void課件制作532.8實(shí)例研究實(shí)例一:C++向量類(vectorclass)創(chuàng)建向量:vector<datatype>vectorname;訪問(wèn)向量元素:與訪問(wèn)數(shù)組類似,使用數(shù)組下標(biāo)運(yùn)算符[]向量中的下標(biāo)從0開始使用數(shù)組下標(biāo)運(yùn)算符[],需確保元素已存在于向量中vector<int>vInt;vector<string>vString;cout<<vInt[3];課件制作542.8實(shí)例研究#include<iostream>#include<vector>#include<string>usingnamespacestd;intmain(){inti,nSizeV;vector<int>intVector;//Storenumbers1,2,3,...,10tothevectorfor(i=0;i<10;i++)intVector.push_back(i+1);//Displaythenumbersinthevectorcout<<"Numbersinthevector:";nSizeV=intVector.size();for(i=0;i<nSizeV;i++)cout<<intVector[i]<<"";

vector<string>stringVector;//StorestringsintothevectorstringVector.push_back("Dallas");stringVector.push_back("Houston");stringVector.push_back("Austin");stringVector.push_back("Norman");//Displaythestringinthevectorcout<<"\nStringsinthestringvector:";for(i=0;i<stringVector.size();i++)cout<<stringVector[i]<<"";stringVector.pop_back();//Removethelastelementvector<string>v2;v2.swap(stringVector);

v2[0]="Atlanta";//Redisplaythestringinthevectorcout<<"\nStringsinthevectorv2:";for(i=0;i<v2.size();i++)cout<<v2.at(i)<<"";cout<<endl;return0;}課件制作552.8實(shí)例研究實(shí)例二:課程類設(shè)計(jì)一課程類,其屬性有課程名、選修該課程的學(xué)生姓名及人數(shù),主要操作有增加、刪除和瀏覽選修該課程的學(xué)生姓名CCourse-----------------------------------------------------strCName:string-vStudents:vector<string>-nNumOfStudents:int----------------------------------------------------+CCourse(strCName:&string)+GetCourseName():string+AddStudent(strSName:&stri

溫馨提示

  • 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)論