版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度全款購(gòu)入進(jìn)口跑車合同范本3篇
- 二零二五年度企業(yè)與個(gè)人投資回報(bào)對(duì)賭協(xié)議3篇
- 二零二五年度員工試用期工作內(nèi)容調(diào)整及考核標(biāo)準(zhǔn)協(xié)議3篇
- 二零二五年度電商平臺(tái)商家會(huì)員返利合同3篇
- 2025年度新能源汽車產(chǎn)業(yè)鏈投資基金合作協(xié)議3篇
- 2025年度公司股東內(nèi)部關(guān)于企業(yè)并購(gòu)整合的專項(xiàng)協(xié)議3篇
- 2025年度綠色能源項(xiàng)目分?jǐn)倕f(xié)議3篇
- 二零二五年度新能源汽車充電樁建設(shè)投資入股合同3篇
- 2025通信銷售合同
- 2025年農(nóng)村土地永久轉(zhuǎn)讓與農(nóng)村電商合作框架合同3篇
- 廣東省東華高級(jí)中學(xué)2025屆高一上數(shù)學(xué)期末考試試題含解析
- GB/T 22081-2024網(wǎng)絡(luò)安全技術(shù)信息安全控制
- 2024-2025學(xué)年上海市閔行區(qū)華東師大二附中九年級(jí)(上)月考數(shù)學(xué)試卷(10月份)(含解析)
- 心理健康教育(共35張課件)
- GB/T 44271-2024信息技術(shù)云計(jì)算邊緣云通用技術(shù)要求
- 工業(yè)項(xiàng)目投資估算及財(cái)務(wù)評(píng)價(jià)附表(有計(jì)算公式)
- 2024-2030年中國(guó)Micro LED行業(yè)發(fā)展現(xiàn)狀調(diào)研及市場(chǎng)前景趨勢(shì)報(bào)告
- 高中英語(yǔ)外研版 單詞表 必修2
- 2024-2030年中國(guó)蓖麻行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 2025國(guó)家開放大學(xué)電大??啤痘A(chǔ)寫作》期末試題及答案(試卷號(hào)2412)
- 用所給詞的適當(dāng)形式填空(專項(xiàng)訓(xùn)練)人教PEP版英語(yǔ)六年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論