




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章類和對象1北京林業(yè)大學(xué)軟件教研室第六章類和對象1北京林業(yè)大學(xué)軟件教研室本章主要內(nèi)容(1)掌握類與對象的概念、定義方法及二者的區(qū)別。(2)掌握類的成員函數(shù)的定義、保存以及調(diào)用方法。(3)掌握類中成員的訪問機(jī)制和方法。(4)了解對象的作用域和生存期。(5)理解并掌握構(gòu)造函數(shù)、析構(gòu)函數(shù)、默認(rèn)構(gòu)造函數(shù)、缺省參數(shù)的構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)的含義、定義方法以及它們在對象的構(gòu)造和撤消中的作用。2北京林業(yè)大學(xué)軟件教研室本章主要內(nèi)容(1)掌握類與對象的概念、定義方法及二者的區(qū)別(6)理解并掌握當(dāng)一個類的對象作為另一個類的數(shù)據(jù)成員時,其利用初始化表調(diào)用構(gòu)造函數(shù)的方法和執(zhí)行順序。(7)掌握堆對象和對象數(shù)組的使用。(8)掌握類的靜態(tài)成員(靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù))的概念、定義方法及其作用。(9)掌握常對象與常成員(常數(shù)據(jù)成員和常成員函數(shù))的概念、定義以及使用方法。(10)掌握友元函數(shù)與友元類的概念、定義方法及其作用。3北京林業(yè)大學(xué)軟件教研室(6)理解并掌握當(dāng)一個類的對象作為另一個類的數(shù)據(jù)成員時,其利6.1類與對象的定義6.1.1類的定義類是把各種不同類型的數(shù)據(jù)(稱為數(shù)據(jù)成員)和對數(shù)據(jù)的操作(稱為成員函數(shù))組織在一起而形成的用戶自定義的數(shù)據(jù)類型。C++中,類定義包括類說明和類實現(xiàn)兩大部分。說明部分提供了對該類所有數(shù)據(jù)成員和成員函數(shù)的描述;實現(xiàn)部分則提供了所有成員函數(shù)的實現(xiàn)代碼。4北京林業(yè)大學(xué)軟件教研室6.1類與對象的定義6.1.1類的定義4北京林業(yè)大學(xué)類定義的一般形式為:class類名{private: 數(shù)據(jù)成員或成員函數(shù)protected: 數(shù)據(jù)成員或成員函數(shù)public: 數(shù)據(jù)成員或成員函數(shù)};<各成員函數(shù)的實現(xiàn)代碼>5北京林業(yè)大學(xué)軟件教研室類定義的一般形式為:5北京林業(yè)大學(xué)軟件教研室如:下例中定義描述圖書的類定義。classRecord{private: //private成員 charbookname[20]; intnumber; public: //public成員 voidregist(char*a,intb); voidshow(); };6北京林業(yè)大學(xué)軟件教研室如:下例中定義描述圖書的類定義。6北京林業(yè)大學(xué)軟件教研室類中的成員類1、數(shù)據(jù)—數(shù)據(jù)成員;2、操作—成員函數(shù);操作成員函數(shù)數(shù)據(jù)數(shù)據(jù)成員私有成員保護(hù)成員公有成員7北京林業(yè)大學(xué)軟件教研室類中的成員類1、數(shù)據(jù)—數(shù)據(jù)成員;操作數(shù)據(jù)私有成員保護(hù)成員公有6.1.2成員函數(shù)的定義類中的成員函數(shù)可以在以下兩處定義:(1)類內(nèi)classRecord{private: charbookname[20]; intnumber;public: voidregist(char*a,intb) { strcpy(bookname,a); number=b; } voidshow() { cout<<”名稱:”<<bookname<<endl; cout<<”號碼:”<<number<<endl; }};8北京林業(yè)大學(xué)軟件教研室6.1.2成員函數(shù)的定義類中的成員函數(shù)可以在以下兩處定(2)類外返回值類型類名::成員函數(shù)名(參數(shù)說明){函數(shù)體}classRecord {private: charbookname[20];intnumber;public: voidregist(char*a,intb); voidshow(); };voidRecord::regist(char*a,intb) { strcpy(bookname,a); number=b;}voidRecord::show() {cout<<”名稱:”<<bookname<<endl; cout<<”號碼:”<<number<<endl;}9北京林業(yè)大學(xué)軟件教研室(2)類外9北京林業(yè)大學(xué)軟件教研室從類的設(shè)計者的視角來看,類定義的代碼可分為接口部分與實現(xiàn)部分;從類的使用者來看,看到的只是類的使用接口。10北京林業(yè)大學(xué)軟件教研室從類的設(shè)計者的視角來看,類定義的代碼可分為接口部分與實現(xiàn)部分練習(xí)類定義的關(guān)鍵字是
。類的訪問權(quán)限有
、
和
三種。類的成員分為
和
。類成員的默認(rèn)訪問模式是
。要存取類內(nèi)的私有成員,需要一個界面,稱為
。類完成了面向?qū)ο蟪绦蛟O(shè)計的
特性。將成員函數(shù)的實現(xiàn)放在類外,所用的作用域運算符為
。11北京林業(yè)大學(xué)軟件教研室練習(xí)類定義的關(guān)鍵字是。11北京林業(yè)大學(xué)練習(xí)指出以下程序出錯的行號
,錯誤的原因是
。①classSample②{③private:④ inta=2;⑤public:⑥ voidprint();⑦};類的數(shù)據(jù)成員不能直接賦值12北京林業(yè)大學(xué)軟件教研室練習(xí)指出以下程序出錯的行號,錯誤的原因練習(xí)下列說法不正確的是()。A.在類中,成員的默認(rèn)訪問特性是私有的。B.類封裝了數(shù)據(jù)和操作。C.類實質(zhì)上是一種數(shù)據(jù)類型。D.在類的定義中,必須包含private、public、protected三種訪問方式對應(yīng)的部分。D13北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法不正確的是()。D13北京林業(yè)大學(xué)軟件6.1.3對象及指向?qū)ο蟮闹羔?.對象的定義
類名對象名表;類是抽象的概念,而對象是具體的概念;每個對象占用了各自的存儲單元,每個對象都各自具有了該類的一套數(shù)據(jù)成員(靜態(tài)成員除外),而所有成員函數(shù)是所有對象共有的。每個對象的成員函數(shù)都通過指針指向同一個代碼空間。14北京林業(yè)大學(xué)軟件教研室6.1.3對象及指向?qū)ο蟮闹羔?.對象的定義14北京林類數(shù)據(jù)成員成員函數(shù)對象1數(shù)據(jù)成員成員函數(shù)對象n數(shù)據(jù)成員……15北京林業(yè)大學(xué)軟件教研室類數(shù)據(jù)成員成員函數(shù)對象1數(shù)據(jù)成員成員函數(shù)對象n數(shù)據(jù)成員……12.指向?qū)ο蟮闹羔?/p>
類名*指針變量名表;Recordbook3;Record*p; p=&book3; 16北京林業(yè)大學(xué)軟件教研室2.指向?qū)ο蟮闹羔?6北京林業(yè)大學(xué)軟件教研室6.1.4訪問對象的成員訪問對象的成員包括讀寫對象的數(shù)據(jù)成員調(diào)用它的成員函數(shù)對象名.數(shù)據(jù)成員名或?qū)ο竺?成員函數(shù)名(實參表)指針變量名->數(shù)據(jù)成員名或指針變量名->成員函數(shù)名(實參表)(*指針變量名).數(shù)據(jù)成員名或(*指針變量名).成員函數(shù)名(實參表)【例6-1】訪問對象的成員。17北京林業(yè)大學(xué)軟件教研室6.1.4訪問對象的成員訪問對象的成員包括17北京林業(yè)大6.1.5指向類成員的指針指向類成員的指針包括:類數(shù)據(jù)成員指針類成員函數(shù)指針1.類數(shù)據(jù)成員指針定義:類型類名::*指針變量名;指向:類數(shù)據(jù)成員指針變量名=&類名::類數(shù)據(jù)成員名;訪問:對象名.*類數(shù)據(jù)成員指針變量名;【例6-2】分析以下程序的執(zhí)行結(jié)果。18北京林業(yè)大學(xué)軟件教研室6.1.5指向類成員的指針指向類成員的指針包括:18北2.類成員函數(shù)指針定義: 類型(類名::*指針變量名)(形參表);指向: 指向類成員函數(shù)的指針變量名=類名::類成員函數(shù)名;調(diào)用: (對象名.*指向類成員函數(shù)的指針變量名)(實參表);【例6-3】分析以下程序的執(zhí)行結(jié)果。19北京林業(yè)大學(xué)軟件教研室2.類成員函數(shù)指針19北京林業(yè)大學(xué)軟件教研室6.1.6this指針在類的每一個成員函數(shù)的形參表中都有一個隱含的指針變量this,該指針變量的類型就是成員函數(shù)所屬類的類型。當(dāng)程序中調(diào)用類的成員函數(shù)時,this指針變量被自動初始化為發(fā)出函數(shù)調(diào)用的對象的地址。盡管在定義成員函數(shù)時沒有看到也沒有定義this指針變量,但在成員函數(shù)的函數(shù)體內(nèi)可以使用this指針變量。voidRecord::regist(char*a,intb){ strcpy(this->bookname,a);
this->number=b;}20北京林業(yè)大學(xué)軟件教研室6.1.6this指針在類的每一個成員函數(shù)的形參表中都有6.1.7對象賦值語句對于同一個類生成的兩個對象,可以進(jìn)行賦值。其功能是將一個對象的數(shù)據(jù)成員賦值到另一個對象中去,賦值語句的左右兩邊各是一個對象名。【例6-4】對于類Example的兩個對象obj1和obj2,使obj2的數(shù)據(jù)成員的值等于obj1的數(shù)據(jù)成員的值(假定obj1的數(shù)據(jù)成員num已經(jīng)存有數(shù)據(jù)215)。21北京林業(yè)大學(xué)軟件教研室6.1.7對象賦值語句對于同一個類生成的兩個對象,可以進(jìn)6.1.8對象的作用域與生存期對象是類的實例,它的實質(zhì)就是某種數(shù)據(jù)類型的變量。classDesk //定義Desk類{ public: intweight; inthigh; intwidth; intlength;};classStool //定義Stool類{ public: intweight; inthigh; intwidth; intlength;};Deskda; //定義全局對象Stoolsa;voidfn(){ staticStoolss; //定義局部靜態(tài)對象 Deskda; //定義局部對象 //……}22北京林業(yè)大學(xué)軟件教研室6.1.8對象的作用域與生存期對象是類的實例,它的實質(zhì)就1.局部對象局部對象(不包括局部靜態(tài)對象)的作用域是定義它的函數(shù)體,其生存期是從函數(shù)調(diào)用開始到函數(shù)調(diào)用結(jié)束,當(dāng)下一次重新調(diào)用函數(shù)時,再重新構(gòu)造對象。構(gòu)造局部對象的次序(即分配存儲單元的次序)是按照它們在函數(shù)體中聲明的次序進(jìn)行的。局部對象所占的存儲空間被分配在程序的動態(tài)區(qū)(棧區(qū))中。23北京林業(yè)大學(xué)軟件教研室1.局部對象23北京林業(yè)大學(xué)軟件教研室2.靜態(tài)對象靜態(tài)對象(局部靜態(tài)對象和全局靜態(tài)對象)的作用域是定義它的函數(shù)體或程序文件,其生存期是整個程序的運行時間。構(gòu)造靜態(tài)對象的次序是按它們在程序中出現(xiàn)的先后次序,且在整個程序運行開始時(即在主函數(shù)運行前)只構(gòu)造一次。靜態(tài)對象所占的存儲空間被分配在程序的靜態(tài)區(qū)(全局區(qū))中。24北京林業(yè)大學(xué)軟件教研室2.靜態(tài)對象24北京林業(yè)大學(xué)軟件教研室3.全局對象全局對象的作用域是整個程序,其生存期是整個程序的運行時間。它也是在程序運行前(即在主函數(shù)運行前)只構(gòu)造一次。全局對象所占的存儲空間被分配在程序的靜態(tài)區(qū)(全局區(qū))中。4.類中成員的構(gòu)造次序類中成員的構(gòu)造次序是以類中聲明成員的次序進(jìn)行的。25北京林業(yè)大學(xué)軟件教研室3.全局對象25北京林業(yè)大學(xué)軟件教研室練習(xí)類的變量稱為
。同一個類的兩個對象,其數(shù)據(jù)成員是不同的,但
是共享的。一個
和
的關(guān)系,正如基本數(shù)據(jù)類型與該類型的變量一樣,如intx;。運算符
與類的對象一起使用,和運算符
與指向類的對象的指針一起使用,可以訪問類的成員。26北京林業(yè)大學(xué)軟件教研室練習(xí)類的變量稱為。26北京林業(yè)大學(xué)下列說法中不正確的是()。A.對象是類的一個實例。B.任何一個對象只能屬于一個類。C.一個類只能有一個對象。D.類與對象間的關(guān)系和數(shù)據(jù)類型與變量間關(guān)系相類似。C練習(xí)27北京林業(yè)大學(xué)軟件教研室下列說法中不正確的是()。C練習(xí)27北京林業(yè)大學(xué)軟練習(xí)以下說法不正確的是()。A.程序中可以定義指向某個類的指針變量。B.類中的數(shù)據(jù)成員不能為指針類型。C.可以定義指向類中某個數(shù)據(jù)成員的指針變量。D.當(dāng)使用指針變量訪問類的成員時,必須先使指針變量指向該類的某個對象。B28北京林業(yè)大學(xué)軟件教研室練習(xí)以下說法不正確的是()。B28北京林業(yè)大學(xué)軟件練習(xí)下列說法不正確的是()。A.同一個類的兩個對象占用相同的內(nèi)存空間。B.要在類的外部直接使用類中的私有成員是錯誤的。C.一個對象數(shù)組中的所有數(shù)組元素屬于同一個類。D.當(dāng)在類的外部定義成員函數(shù)時,必須在函數(shù)名前加上類名和作用域運算符“::”。A29北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法不正確的是()。A29北京林業(yè)大學(xué)軟件練習(xí)指出以下程序中的錯誤,并說明原因。1.#include<iostream.h>classpoint{private: intx; inty;public: voidsetvalue(intxval,intyval) { x=xval;y=yval;}};voidmain(){ pointp; p.setvalue(10,20); cout<<"x="<<x<<",y="<<y<<endl;}不能在類外訪問類的私有成員,只能通過類的成員函數(shù)訪問。30北京林業(yè)大學(xué)軟件教研室練習(xí)指出以下程序中的錯誤,并說明原因。不能在類外訪問類的私有2.#include<iostream.h>classA{private: inta=0;public: voidseta(inti){a=i;} voidprint(){cout<<"a="<<a<<endl;}}voidmain(){ Aobj; obj.a=10; obj.print();}inta;;obj.seta(10);31北京林業(yè)大學(xué)軟件教研室2.#include<iostream.h>inta;練習(xí)分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classTime{private: inthour; intminute; intsecond;public: voiddisp();};voidTime::disp(){ cout<<hour<<"小時"<<minute<<"分鐘"<<second<<"秒"<<endl;}voidmain(){ Timetime; time.disp();}#include<iostream.h>classTime{private: inthour;intminute;intsecond;public:
Time(); voiddisp();};Time::Time(){ hour=0; minute=0;second=0;}voidTime::disp(){ cout<<hour<<"小時"<<minute<<"分鐘"<<second<<"秒"<<endl;}voidmain(){ Timetime; time.disp();}32北京林業(yè)大學(xué)軟件教研室練習(xí)分析以下程序的執(zhí)行結(jié)果。#include<iostre6.2構(gòu)造函數(shù)與析構(gòu)函數(shù)6.2.1構(gòu)造函數(shù)構(gòu)造函數(shù)(Constructor)是與類名同名的特殊的成員函數(shù);構(gòu)造函數(shù)的執(zhí)行是在系統(tǒng)創(chuàng)建對象時自動執(zhí)行。33北京林業(yè)大學(xué)軟件教研室6.2構(gòu)造函數(shù)與析構(gòu)函數(shù)6.2.1構(gòu)造函數(shù)33北京構(gòu)造函數(shù)的定義格式為:類名(形參說明){函數(shù)體}【例6-5】類Person中包括4個數(shù)據(jù)成員,用來記錄人員的信息;利用該類生成對象obj,且使用構(gòu)造函數(shù)為obj賦予初始值。34北京林業(yè)大學(xué)軟件教研室構(gòu)造函數(shù)的定義格式為:34北京林業(yè)大學(xué)軟件教研室6.2.2構(gòu)造函數(shù)的重載如果一個類中出現(xiàn)了兩個以上的同名成員函數(shù),則稱為類的成員函數(shù)的重載。一個類的成員函數(shù)和另一個類的成員函數(shù)同名;一個類的成員函數(shù)與一個類外的函數(shù)同名;35北京林業(yè)大學(xué)軟件教研室6.2.2構(gòu)造函數(shù)的重載如果一個類中出現(xiàn)了兩個以上的同在類的成員函數(shù)的重載中,比較常見的形式是構(gòu)造函數(shù)的重載。在對象定義時,系統(tǒng)會根據(jù)參數(shù)的類型及個數(shù)選擇調(diào)用某一種合適的構(gòu)造函數(shù)完成對象的構(gòu)造。【例6-6】類Rec定義兩個重載函數(shù),其中,一個是無參函數(shù),另一個是有參函數(shù),且它們都是構(gòu)造函數(shù)。36北京林業(yè)大學(xué)軟件教研室在類的成員函數(shù)的重載中,比較常見的形式是構(gòu)造函數(shù)的重載。366.2.3默認(rèn)構(gòu)造函數(shù)與缺省參數(shù)的構(gòu)造函數(shù)C++規(guī)定,每個類必須有一個構(gòu)造函數(shù),沒有構(gòu)造函數(shù)就不能創(chuàng)建對象。如果在類中沒有顯式定義構(gòu)造函數(shù),則C++編譯系統(tǒng)在編譯時為該類提供一個默認(rèn)的構(gòu)造函數(shù)。只要一個類定義了一個構(gòu)造函數(shù),則C++編譯系統(tǒng)就不再提供默認(rèn)的構(gòu)造函數(shù)。也就是說,如果已經(jīng)為類定義了一個帶參數(shù)的構(gòu)造函數(shù),但還想要無參構(gòu)造函數(shù),則必須自己定義。37北京林業(yè)大學(xué)軟件教研室6.2.3默認(rèn)構(gòu)造函數(shù)與缺省參數(shù)的構(gòu)造函數(shù)C++規(guī)定,當(dāng)構(gòu)造函數(shù)的參數(shù)具有默認(rèn)值時,稱為具有缺省參數(shù)的構(gòu)造函數(shù)。使用默認(rèn)值時要注意以下幾點:(1)只能出現(xiàn)在類定義的接口部分,而不能出現(xiàn)在類定義的實現(xiàn)部分。(2)所有具有默認(rèn)值的參數(shù)必須處在參數(shù)表的最右邊。(3)在使用具有缺省參數(shù)的構(gòu)造函數(shù)時,要防止二義性。38北京林業(yè)大學(xué)軟件教研室當(dāng)構(gòu)造函數(shù)的參數(shù)具有默認(rèn)值時,稱為具有缺省參數(shù)的構(gòu)造函數(shù)。3classMyclass {private: intmember; public: Myclass(); Myclass(inti=10); };Myclass::Myclass() { member=10; }Myclass::Myclass(inti) { member=i; }voidmain(){ Myclassx(20); Myclassy; //產(chǎn)生二義性}39北京林業(yè)大學(xué)軟件教研室classMyclass 39北京林業(yè)大學(xué)軟件教6.2.4析構(gòu)函數(shù)析構(gòu)函數(shù)其函數(shù)名稱是在類名的前面加上“~”。它沒有返回值和參數(shù),不能隨意調(diào)用,也沒有重載。只是在類對象生命期結(jié)束時,系統(tǒng)自動調(diào)用。~類名(){函數(shù)體}40北京林業(yè)大學(xué)軟件教研室6.2.4析構(gòu)函數(shù)析構(gòu)函數(shù)其函數(shù)名稱是在類名的前面加上說明:(1)如果程序員在定義類時沒有為類提供析構(gòu)函數(shù),則系統(tǒng)會自動創(chuàng)建一個默認(rèn)的析構(gòu)函數(shù),其形式為:~類名(){}(2)如果在類的對象中分配有動態(tài)內(nèi)存,就必須為該類提供適當(dāng)?shù)奈鰳?gòu)函數(shù),以完成清理工作。(3)一個類中只能擁有一個析構(gòu)函數(shù)。(4)對象被析構(gòu)的順序與其建立時的順序正好相反?!纠?-7】類Teacher的構(gòu)造函數(shù)為name申請存儲空間,在析構(gòu)函數(shù)中釋放該空間。41北京林業(yè)大學(xué)軟件教研室說明:41北京林業(yè)大學(xué)軟件教研室6.2.5拷貝構(gòu)造函數(shù)生成一個對象的副本有兩種途徑:建立一個新對象,然后將一個已有對象的數(shù)據(jù)成員的值取出來,一一賦給新的對象的各個數(shù)據(jù)成員。使類具有自行復(fù)制本類對象的能力,這就是拷貝構(gòu)造函數(shù)的功能。一種特殊的構(gòu)造函數(shù)類名::類名(const類名&形式參數(shù)){函數(shù)體}42北京林業(yè)大學(xué)軟件教研室6.2.5拷貝構(gòu)造函數(shù)生成一個對象的副本有兩種途徑:42說明:(1)拷貝構(gòu)造函數(shù)的名稱與類的名稱相同,且它只有一個參數(shù)。該參數(shù)就是對該類對象的引用。(2)拷貝構(gòu)造函數(shù)的功能是用于實現(xiàn)對象值的拷貝。用一個對象去構(gòu)造另外一個對象。(3)如果程序員沒有提供顯式的拷貝構(gòu)造函數(shù),則系統(tǒng)會自動提供一個默認(rèn)的拷貝構(gòu)造函數(shù)?!纠?-8】下面程序代碼定義了一個表示點的類Point,其數(shù)據(jù)成員x和y分別表示點的橫、縱坐標(biāo)。43北京林業(yè)大學(xué)軟件教研室說明:43北京林業(yè)大學(xué)軟件教研室(4)拷貝構(gòu)造函數(shù)被自動調(diào)用執(zhí)行的三種情況:①當(dāng)用類的一個對象去初始化該類的另一個對象時。如【例6-8】的語句Pointp2(p1)。②如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,進(jìn)行形參和實參結(jié)合時?!纠?-9】在【例6-8】定義的類Point的基礎(chǔ)上,定義一個全局函數(shù)printx,并改寫main函數(shù)。③如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回調(diào)用者時自動執(zhí)行拷貝構(gòu)造函數(shù)。【例6-10】在【例6-8】定義的類Point的基礎(chǔ)上,定義一個全局函數(shù)func,并改寫main函數(shù)。44北京林業(yè)大學(xué)軟件教研室(4)拷貝構(gòu)造函數(shù)被自動調(diào)用執(zhí)行的三種情況:44北京林業(yè)大學(xué)6.2.6淺拷貝與深拷貝淺拷貝:由默認(rèn)的拷貝構(gòu)造函數(shù)將已有對象的數(shù)據(jù)成員一一賦值給同類的新對象的各數(shù)據(jù)成員來構(gòu)造新對象的方法就是淺拷貝,即成員級拷貝。缺點:在程序中進(jìn)行對象的復(fù)制時,也可以有選擇、有變化地復(fù)制,這時默認(rèn)的拷貝構(gòu)造函數(shù)就不能勝任了。淺拷貝會帶來數(shù)據(jù)安全方面的隱患。45北京林業(yè)大學(xué)軟件教研室6.2.6淺拷貝與深拷貝淺拷貝:由默認(rèn)的拷貝構(gòu)造函數(shù)將已深拷貝對于指針型數(shù)據(jù)成員,要拷貝的是其所指向的區(qū)域內(nèi)容而不是指針值。要完成深拷貝,用戶必須編寫自定義的拷貝構(gòu)造函數(shù),在拷貝構(gòu)造函數(shù)中先要分配存儲空間,然后再將相應(yīng)的內(nèi)容拷貝過來,而不能采用默認(rèn)的拷貝構(gòu)造函數(shù)。46北京林業(yè)大學(xué)軟件教研室深拷貝對于指針型數(shù)據(jù)成員,要拷貝的是其所指向的區(qū)域內(nèi)容而不是淺拷貝與深拷貝的處理過程:對象a對象b堆空間對象a對象b堆空間堆空間[例6-11]Person是一個人員信息類。用普通構(gòu)造函數(shù)生成obj1,用拷貝構(gòu)造函數(shù)生成obj2。淺拷貝深拷貝47北京林業(yè)大學(xué)軟件教研室淺拷貝與深拷貝的處理過程:對象a對象b堆空間對象a對象b堆空深拷貝淺拷貝48北京林業(yè)大學(xué)軟件教研室深拷貝淺拷貝48北京林業(yè)大學(xué)軟件教研室練習(xí)
是用來初始化類的數(shù)據(jù)成員的一種特殊的成員函數(shù)。一個類有
個構(gòu)造函數(shù),有
個析構(gòu)函數(shù)。構(gòu)造函數(shù)是
被創(chuàng)建時自動執(zhí)行,對象消失時自動執(zhí)行的成員函數(shù)稱為
。49北京林業(yè)大學(xué)軟件教研室練習(xí)是用來初始化類的數(shù)據(jù)成員的一種特殊的練習(xí)下列說法不正確的是()A.類中有且僅有一個析構(gòu)函數(shù)B.析構(gòu)函數(shù)可以有形參。C.析構(gòu)函數(shù)沒有函數(shù)類型。D.析構(gòu)函數(shù)在對象消失時被自動執(zhí)行。B50北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法不正確的是()B50北京林業(yè)大學(xué)軟件教練習(xí)下列說法不正確的是()A.一個類中有且僅有一個構(gòu)造函數(shù)。B.構(gòu)造函數(shù)在說明類變量時被自動執(zhí)行。C.構(gòu)造函數(shù)沒有函數(shù)類型。D.類中的構(gòu)造函數(shù)的函數(shù)名與該類的類名必須同名。A51北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法不正確的是()A51北京林業(yè)大學(xué)軟件教6.3對象成員及其初始化6.3.1對象成員把已有類的對象作為新類的數(shù)據(jù)成員,這時可稱這種成員是新建類的子對象或?qū)ο蟪蓡T。52北京林業(yè)大學(xué)軟件教研室6.3對象成員及其初始化6.3.1對象成員52北京林新類定義格式可表示為:classX{ 類名1成員1; 類名2成員2; …… 類名n成員n; …… };53北京林業(yè)大學(xué)軟件教研室新類定義格式可表示為:53北京林業(yè)大學(xué)軟件教研室6.3.2對象成員的初始化含有對象成員的類的構(gòu)造函數(shù)的定義格式為:X::X(參數(shù)表0):對象成員1(參數(shù)表1), 對象成員2(參數(shù)表2), …, 對象成員n(參數(shù)表n){……}初始化表54北京林業(yè)大學(xué)軟件教研室6.3.2對象成員的初始化含有對象成員的類的構(gòu)造函數(shù)的在構(gòu)造類X的對象過程中:系統(tǒng)首先調(diào)用其子對象的構(gòu)造函數(shù)、初始化子對象;然后才執(zhí)行類X自己的構(gòu)造函數(shù)的函數(shù)體以完成初始化本類中的非對象成員。對于同一類中的不同子對象,系統(tǒng)按照它們在類中的說明順序調(diào)用相應(yīng)的構(gòu)造函數(shù)進(jìn)行初始化,而不是按照初始化表的順序進(jìn)行初始化。55北京林業(yè)大學(xué)軟件教研室在構(gòu)造類X的對象過程中:55北京林業(yè)大學(xué)軟件教研室【例6-12】以下定義了3個類:Student、Teacher和Tutor,其中Student類的對象和Teacher類的對象作為Tutor類的數(shù)據(jù)成員。觀察對象的構(gòu)造過程和構(gòu)造函數(shù)被執(zhí)行的順序?!纠?-13】分析以下程序的執(zhí)行結(jié)果。56北京林業(yè)大學(xué)軟件教研室【例6-12】以下定義了3個類:Student、Teache也可以使用初始化表的方式對類的普通數(shù)據(jù)成員進(jìn)行初始化。假設(shè)有如下類定義:classA{ inta;public: A(intx);};則可以有2種形式實現(xiàn)構(gòu)造函數(shù):A::A(intx){ a=x; }或者:A::A(intx):a(x){ }57北京林業(yè)大學(xué)軟件教研室也可以使用初始化表的方式對類的普通數(shù)據(jù)成員進(jìn)行初始化。假設(shè)有6.4類作用域類作用域又可稱為類域,它是指在類定義中用一對大括號括起來的范圍。在類域中定義的變量不能使用auto、register和extern等修飾符,而且在類域中定義的函數(shù)也不能使用extern修飾符。在類域中定義的靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)還具有外部的連接屬性?!纠?-14】類域及其成員引用舉例。58北京林業(yè)大學(xué)軟件教研室6.4類作用域類作用域又可稱為類域,它是指在類定義中用6.5堆對象和對象數(shù)組6.5.1堆對象使用new運算符動態(tài)分配的對象屬于堆對象,其所占存儲空間被分配在堆區(qū)。堆對象在使用完畢后,及時用delete運算符進(jìn)行釋放,其作用域為從創(chuàng)建到釋放的執(zhí)行范圍之中。59北京林業(yè)大學(xué)軟件教研室6.5堆對象和對象數(shù)組6.5.1堆對象59北京林業(yè)classDate { private: intmonth; intday; intyear; public: Date(intm,intd,inty); };Date::Date(intm,intd,inty) { if(m>0&&m<13) month=m; if(d>0&&d<32) day=d; if(y>0&&y<3000) year=y;}voidmain(){ Date*pd; pd=newDate(1,1,1998); //…… delete(pd); }60北京林業(yè)大學(xué)軟件教研室classDate 60北京林業(yè)大學(xué)軟件教研室6.5.2對象數(shù)組對象數(shù)組:數(shù)組中的每個元素都是類的一個對象。類名數(shù)組名[數(shù)組大小];【例6-15】類Person是說明人員的信息結(jié)構(gòu)。用Person生成一個對象數(shù)組emp[5],并通過成員函數(shù)assignment()將人員信息填入,然后將它們顯示出來。61北京林業(yè)大學(xué)軟件教研室6.5.2對象數(shù)組對象數(shù)組:數(shù)組中的每個元素都是類的一個讀程序#include<iostream.h>#include<string.h>classPerson{private: intno; charname[20];public: voidsetvalue(constintno,constcharname[]) {this->no=no; strcpy(this->name,name);} intgetno(){returnno;} char*getname(){returnname;}};voidmain(){ Person*p; p=newPerson[2]; p->setvalue(1,"zhang"); p++; (*p).setvalue(2,"zhao"); p--; for(inti=0;i<2;i++) cout<<p++->getno()<<","<<(*p).getname()<<endl;}1,zhang2,zhao62北京林業(yè)大學(xué)軟件教研室讀程序#include<iostream.h>1,zhan6.6靜態(tài)成員同一類的各個對象之間如何共享數(shù)據(jù)?在類中增加用于共享的新的普通成員。在類中設(shè)置一種“特殊”的成員——靜態(tài)成員。靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)63北京林業(yè)大學(xué)軟件教研室6.6靜態(tài)成員同一類的各個對象之間如何共享數(shù)據(jù)?63北京6.6.1靜態(tài)數(shù)據(jù)成員class類名{ …… static類型說明符成員名; ……};【例6-16】報名登記處登記每一位來訪者的姓名,同時使用靜態(tài)數(shù)據(jù)成員glob自動產(chǎn)生一個流水號數(shù),記入number中。64北京林業(yè)大學(xué)軟件教研室6.6.1靜態(tài)數(shù)據(jù)成員class類名64北京林業(yè)大學(xué)6.6.2靜態(tài)成員函數(shù)1.類中靜態(tài)成員函數(shù)的定義格式class類名{ …… static類型函數(shù)名(形參){函數(shù)體} ……};65北京林業(yè)大學(xué)軟件教研室6.6.2靜態(tài)成員函數(shù)1.類中靜態(tài)成員函數(shù)的定義格式652.類的靜態(tài)成員函數(shù)的調(diào)用靜態(tài)成員函數(shù)屬于類,由同一個類的所有對象共享,所以,訪問靜態(tài)成員函數(shù)時不需要類的對象。類名::靜態(tài)成員函數(shù)名(實參表)對象名.靜態(tài)成員函數(shù)名(實參表)在類的外部不能調(diào)用類中在protected和private部分說明的靜態(tài)成員函數(shù)?!纠?-17】靜態(tài)成員函數(shù)的使用。66北京林業(yè)大學(xué)軟件教研室2.類的靜態(tài)成員函數(shù)的調(diào)用66北京林業(yè)大學(xué)軟件教研室3.使用靜態(tài)成員函數(shù)的其他注意事項#include<iostream.h>classStudent{protected:charname[40]; staticintage;public: staticvoidprint() {cout<<name<<endl;//不能直接訪問類的非靜態(tài)數(shù)據(jù)成員 cout<<age<<endl;//可以直接訪問類的靜態(tài)數(shù)據(jù)成員 }};intStudent::age=18;voidmain(){ Students; s.print(); Student::print();}67北京林業(yè)大學(xué)軟件教研室3.使用靜態(tài)成員函數(shù)的其他注意事項67北京林業(yè)大學(xué)軟件教【例6-18】下列程序中定義了一個類Sample,在private部分中定義了一個普通數(shù)據(jù)成員x和一個靜態(tài)數(shù)據(jù)成員y,在public部分定義了一個構(gòu)造函數(shù)和一個靜態(tài)成員函數(shù)print。68北京林業(yè)大學(xué)軟件教研室【例6-18】下列程序中定義了一個類Sample,在priv【例6-19】閱讀下面程序,理解在類的內(nèi)部和外部訪問類的普通數(shù)據(jù)成員和靜態(tài)數(shù)據(jù)成員的方法以及區(qū)別,理解調(diào)用類的普通成員函數(shù)和類的靜態(tài)成員函數(shù)的方法以及區(qū)別。69北京林業(yè)大學(xué)軟件教研室【例6-19】閱讀下面程序,理解在類的內(nèi)部和外部訪問類的普通練習(xí)
類的靜態(tài)成員分為
和
。靜態(tài)數(shù)據(jù)成員在定義或說明時,前面要加上關(guān)鍵字
。類的
成員函數(shù)不能對類中的非靜態(tài)成員進(jìn)行默認(rèn)訪問。類的
數(shù)據(jù)成員是類的所有對象共享的成員。如果成員函數(shù)不需要訪問類的
成員,則可以把它聲明為靜態(tài)成員函數(shù)。70北京林業(yè)大學(xué)軟件教研室練習(xí)類的靜態(tài)成員分為和練習(xí)閱讀下列程序,并寫出相應(yīng)的執(zhí)行結(jié)果。#include<iostream.h>classTc{private:intA;staticintB;public:Tc(inta){A=a;B+=a;}staticvoiddisplay(Tcc){cout<<"A="<<c.A<<",B="<<B<<endl;}};intTc::B=2;voidmain(){ Tcobj1(2),obj2(4); Tc::display(obj1); Tc::display(obj2);}A=2,B=8A=4,B=871北京林業(yè)大學(xué)軟件教研室練習(xí)閱讀下列程序,并寫出相應(yīng)的執(zhí)行結(jié)果。intTc::B6.7友元函數(shù)和友元類C++提供了一種允許外部類和外部函數(shù)存取類的私有成員和保護(hù)成員的輔助方法,即將它們聲明為一個給定類的友元,使其具有類成員函數(shù)的訪問權(quán)限。但友元本身不是類的成員,它不屬于任何類。72北京林業(yè)大學(xué)軟件教研室6.7友元函數(shù)和友元類C++提供了一種允許外部類和外部函在一個類中,可以利用關(guān)鍵字friend將別的模塊聲明為它的友元,這樣,這個類中本來隱藏的信息就可以被友元訪問。如果友元是一般函數(shù)或類的成員函數(shù),稱為友元函數(shù);如果友元是一個類,則稱為友元類。友元類的所有成員函數(shù)都成為友元函數(shù)。73北京林業(yè)大學(xué)軟件教研室在一個類中,可以利用關(guān)鍵字friend將別的模塊聲明為它的友6.7.1友元函數(shù)在類定義中由friend修飾的非成員函數(shù)??梢允且粋€普通的函數(shù),也可以是其他類的成員函數(shù);不是本類的成員函數(shù),但是在它的函數(shù)體中可以通過對象名訪問類的私有和保護(hù)成員。74北京林業(yè)大學(xué)軟件教研室6.7.1友元函數(shù)在類定義中由friend修飾的非成員函class類名{……//類中的其他成員
friend類型函數(shù)名(形參表);……//類中的其他成員};75北京林業(yè)大學(xué)軟件教研室class類名75北京林業(yè)大學(xué)軟件教研室說明:(1)友元函數(shù)的聲明,可以放在類的私有部分進(jìn)行,也可以放在公有部分,沒有區(qū)別。(2)友元函數(shù)的實現(xiàn),可以直接放在類的內(nèi)部,也可以在類的外部。(3)若要在友元函數(shù)中,對類的成員進(jìn)行訪問,則必須在參數(shù)表中顯式地指明要訪問的對象。76北京林業(yè)大學(xué)軟件教研室說明:76北京林業(yè)大學(xué)軟件教研室(4)友元函數(shù)是能訪問類的所有成員的普通函數(shù),一個函數(shù)可以是多個類的友元函數(shù),需要分別聲明。(5)一個類的友元函數(shù)與該類的類內(nèi)成員函數(shù)一樣享有對該類一切成員的訪問權(quán)。(6)友元函數(shù)的調(diào)用方式和原理與一般函數(shù)相同。(7)C++不允許將某個類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和虛函數(shù)聲明為友元函數(shù)?!纠?-20】友元函數(shù)的定義和使用方法。77北京林業(yè)大學(xué)軟件教研室(4)友元函數(shù)是能訪問類的所有成員的普通函數(shù),一個函數(shù)可以是練習(xí)本程序是否正確?如不正確,錯在哪里?如何改正?改正后程序執(zhí)行結(jié)果是什么?#include<iostream.h>classA{private: intx;public: A(inta){x=a;} voidprint(){cout<<"x="<<x<<endl;}};voidsetx(A&a,intval){ a.x=val;}voidmain(){ Aa(10); a.print(); setx(a,8); a.print();}cannotaccessprivatememberdeclaredinclass'A'friendvoidsetx(A&a,intval);x=10x=878北京林業(yè)大學(xué)軟件教研室練習(xí)本程序是否正確?如不正確,錯在哪里?如何改正?改正后程序6.7.2友元類類A中的某些成員函數(shù)要訪問類B中的數(shù)據(jù)成員時:
class類名B{……//類中的其他成員
friendclass類名A; ……//類中的其他成員};【例6-21】有兩個類Cla_1和Cla_2。在類Cla_1的定義中說明了友元類Cla_2。主函數(shù)中用它們生成了兩個對象,然后對這兩個對象的私有成員進(jìn)行訪問。
79北京林業(yè)大學(xué)軟件教研室6.7.2友元類類A中的某些成員函數(shù)要訪問類B中的數(shù)據(jù)成練習(xí)友元可以是
,也可以是
。友元函數(shù)
類的成員函數(shù)。(是/不是)友元函數(shù)的聲明可以放在類的
部分,也可以放在
部分,它們是沒有區(qū)別的。若需要把一個函數(shù)“voidfun();”定義為一個類A的友元函數(shù),則應(yīng)在類A的定義中加入一條語句:
。如果說明類B是類A的友元類,則類B的所有成員函數(shù)都是類A的
。80北京林業(yè)大學(xué)軟件教研室練習(xí)友元可以是,也可以是編程練習(xí)設(shè)計一個點類Point,其中包含點的坐標(biāo)x和y2個數(shù)據(jù)成員,并設(shè)計2個友元函數(shù),分別計算兩點間的水平距離和垂直距離。(Point.cpp)81北京林業(yè)大學(xué)軟件教研室編程練習(xí)設(shè)計一個點類Point,其中包含點的坐標(biāo)x和y2個數(shù)6.8常對象與常成員共享&&防止改變82北京林業(yè)大學(xué)軟件教研室6.8常對象與常成員共享&&防止改變82北京林業(yè)大學(xué)6.8.1常對象常對象是指對象常量:
const類名對象名;或 類名const對象名;常對象的特點:(1)常對象必須進(jìn)行初始化,而且不能被更新。(2)常對象只能調(diào)用類中那些不改變數(shù)據(jù)成員值的成員函數(shù)(即常成員函數(shù)),而不能調(diào)用類中的其他普通成員函數(shù)。83北京林業(yè)大學(xué)軟件教研室6.8.1常對象常對象是指對象常量:83北京林業(yè)大學(xué)#include<iostream.h>classX{ private: inta,b; public: X(intx,inty) { a=x; b=y; } voidshow() { cout<<"a="<<a<<"b="<<b<<endl; }};voidmain(){ constXobj(10,20);//定義的時候必須初始化 obj.show(); //常對象不能調(diào)用類的普通成員函數(shù)}84北京林業(yè)大學(xué)軟件教研室#include<iostream.h>84北京林業(yè)大學(xué)6.8.2常成員可以分為常成員函數(shù)和常數(shù)據(jù)成員。1.常數(shù)據(jù)成員class類名{……//類中的其他成員
const類型名數(shù)據(jù)成員名;……//類中的其他成員};85北京林業(yè)大學(xué)軟件教研室6.8.2常成員可以分為常成員函數(shù)和常數(shù)據(jù)成員。85北需要利用構(gòu)造函數(shù)的初始化表進(jìn)行初始化:類名::類名(形參表):常數(shù)據(jù)成員名1(值1),常數(shù)據(jù)成員名2(值2),…{ //構(gòu)造函數(shù)的函數(shù)體}86北京林業(yè)大學(xué)軟件教研室需要利用構(gòu)造函數(shù)的初始化表進(jìn)行初始化:86北京林業(yè)大學(xué)軟classTime{protected: constinthour; //常量數(shù)據(jù)成員hour int&minute; //引用數(shù)據(jù)成員minute inti; public:
Time(inti) { i=n; hour=10; minute=i; } //此構(gòu)造函數(shù)對成員hour和minute的初始化是錯誤的};Time(inti):hour(10),minute(i){i=n; } //此構(gòu)造函數(shù)對成員hour和minute的初始化是正確的【例6-22】利用初始化表對常量數(shù)據(jù)成員提供初值。87北京林業(yè)大學(xué)軟件教研室classTimeTime(inti):hour(10)練習(xí)——改錯#include<iostream.h>classInit{private: constintnum; intcount;public: Init() { num=1; count=10; } voidprint(){cout<<"num="<<num<<",count="<<count<<endl;}};voidmain(){ Initobj; obj.print();}Init():num(1){count=10;}88北京林業(yè)大學(xué)軟件教研室練習(xí)——改錯#include<iostream.h>Ini2.常成員函數(shù)class類名{……//類中的其他成員
類型函數(shù)名(形參表)const;……//類中的其他成員};89北京林業(yè)大學(xué)軟件教研室2.常成員函數(shù)89北京林業(yè)大學(xué)軟件教研室常成員函數(shù)的特點:(1)只讀函數(shù),也不能調(diào)用該類中沒有const修飾的其他成員函數(shù)。(2)const關(guān)鍵字是函數(shù)類型的一部分,其實現(xiàn)部分中也要帶const關(guān)鍵字。(3)const關(guān)鍵字可以區(qū)分重載函數(shù)。【例6-23】常成員函數(shù)和常對象的使用。90北京林業(yè)大學(xué)軟件教研室常成員函數(shù)的特點:90北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法中不正確的是()A.類的常數(shù)據(jù)成員和引用成員必須在構(gòu)造函數(shù)的初始化表中進(jìn)行初始化。B.常成員函數(shù)可以對類中的任何數(shù)據(jù)成員進(jìn)行更新操作。C.利用常對象只能調(diào)用類中的常成員函數(shù)。D.在程序中既可以定義指針數(shù)據(jù)成員,也可以定義對象指針。B91北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法中不正確的是()B91北京林業(yè)大學(xué)軟件練習(xí)下列說法中正確的是()A.拷貝構(gòu)造函數(shù)的形參是某個對象名。B.構(gòu)造函數(shù)不能設(shè)置默認(rèn)參數(shù)。C.拷貝構(gòu)造函數(shù)的形參是某個對象的引用名。D.常對象既可以定義時進(jìn)行初始化,也可以在程序中隨時調(diào)用成員函數(shù)進(jìn)行數(shù)據(jù)更新。C92北京林業(yè)大學(xué)軟件教研室練習(xí)下列說法中正確的是()C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云計算HCIP模考試題與參考答案
- 個人借款申請書范文
- 業(yè)務(wù)員年度工作計劃
- 企業(yè)弱電維護(hù)合同范本
- 三八婦女節(jié)護(hù)士愛崗敬業(yè)的演講稿
- 南通批發(fā)市場用電合同范本
- 醫(yī)院房子出售合同范本
- 臺球俱樂部采購合同范本
- 南京租房陰陽合同范例
- 區(qū)域 加盟 合同范本
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- 生物醫(yī)學(xué)工程倫理 課件全套 第1-10章 生物醫(yī)學(xué)工程與倫理-醫(yī)學(xué)技術(shù)選擇與應(yīng)用的倫理問題
- 新戰(zhàn)略營銷課件
- 人文地理學(xué)考試名詞解釋全套
- 統(tǒng)編版五年級下冊第五單元 習(xí)作:形形色色的人 課件 (共16張PPT)
- 大數(shù)據(jù)介紹課件
- 養(yǎng)老專題:養(yǎng)老理念
- 幼兒園多媒體PPT課件制作PPT完整全套教學(xué)課件
- 《蘇東坡傳》閱讀匯報
- 2023離婚協(xié)議模板下載
- 特殊需要兒童的鑒定與分類
評論
0/150
提交評論