




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章類和對象的基礎第7章類和對象的基礎1本章內容提要類與對象的定義對象的初始化成員函數的特性靜態(tài)成員友元類的作用域與對象的生存期本章內容提要類與對象的定義2一、類與對象的定義什么是類?類是一種新的數據類型。類是邏輯相關的函數和數據的封裝,是對所處理的問題的抽象描述,所以,類是實現(xiàn)抽象類型的工具。類(Class):是一種用戶定義的類型,它包括定義的數據和其對應的操作(函數)。使用對象將數據和操作進行封裝(Encapsulation)。一、類與對象的定義什么是類?3什么是對象?類實例化后便生成對象。對象(Object):含有數據(對象的屬性Attribute)又含有對數據的操作代碼(Method)的一個邏輯封裝體。屬性:描述對象特征的數據。方法:對屬性的操作。面向對象編程利用對象進行程序設計什么是對象?類實例化后便生成對象。41.類的定義類的定義一般分為說明部分和實現(xiàn)部分。說明部分:類中的成員數據成員成員函數的說明實現(xiàn)部分成員函數的具體定義例如:定義一個汽車類型號、外殼、車輪等(數據成員)啟動、加速和停止等(成員函數)1.類的定義類的定義5類的定義格式:class<類名>{
public:
<公有數據成員和成員函數的說明或實現(xiàn)>
private:
<私有數據成員和成員函數的說明或實現(xiàn)>protected:<保護數據成員和成員函數的說明或實現(xiàn)>};
<各個成員函數的實現(xiàn)>類的定義格式:class<類名>6例:坐標點類問題:將坐標點與相應操作封裝成類classTPoint{
public:
voidSetxy(inta,intb);//說明在類體內,定義在類體外
voidMove(int,int);//函數原型聲明,參數名可給可不給出
voidPrint();intGetx();intGety();
private:
intx,y;//數據成員};
例:坐標點類問題:將坐標點與相應操作封裝成類classT7例:坐標點類(續(xù)上)問題:將坐標點與相應操作封裝成類voidTPoint::Setxy(inta,intb){
x=a;y=b;}voidTPoint:move(inta,intb){
x=x+a;y=y+b;}voidTPoint::Print();{
cout<<"x="<<Getx()<<"y="<<Gety();}intTPoint::Getx(){returnx;}intTPoint::Gety(){returny;}在類體外定義成員函數的一般格式為:<函數類型><類名>::<成員函數>(<參數表>){<函數體>}其中,作用域運算符“::”是用來標識成員函數是屬于哪個類的,
“類名”是成員函數所屬類的名字。若在函數前加關鍵詞inline,
則成為內聯(lián)成員函數。若函數較短,可以在類內定義,也稱作
內聯(lián)成員函數。例:坐標點類(續(xù)上)問題:將坐標點與相應操作封裝成類voi8例:坐標點類(內聯(lián)函數形式)問題:將說明部分和實現(xiàn)部分都在類體內定義。classTPoint//類名{
public://聲明其后為公有成員
voidSetxy(inta,intb){x=a;y=b;}voidMove(inta,intb){x=x+a;y=y+b;}voidPrint(){cout<<"x="<<Getx()<<"y="<<Gety();}intGetx(){returnx;}intGety(){returny;}
private:
intx,y;//數據成員};
例:坐標點類(內聯(lián)函數形式)問題:將說明部分和實現(xiàn)部分都在92.對象的定義與使用對象的定義格式:
<類名><對象名列表>說明:<類名>是定義對象所屬類的名字。<對象名列表>可有多個對象名,用逗號分隔。例如:TPointp1,p2;//定義TPoint類型的對象p1和p2。TPoint*p=&p1;//定義指向對象p1的TPoint類型的指針p。TPoint&c=p2;//定義c為TPoint類型對象p2的引用。TPointm[5];//定義一個TPoint類型的對象數組。2.對象的定義與使用對象的定義格式:
<類名><對象102.對象的定義與使用對象中數據成員和成員函數的表示方式1:<對象名>.<成員名><對象名>.<成員名>(<參數表>)例如:p1.x,p1.y,p1.Setxy(2,3)對象中數據成員和成員函數的表示方式2:<對象指針名>-><成員名>或者(*<對象指針名>).<成員名><對象指針名>-><成員名>(<參數表>)或者(*<對象指針名>).<成員名>(<參數表>)例如:p->x,p->y,p->Getxy(inta,intb)或者(*p).x,(*p).y,(*p).Getxy(inta,intb)2.對象的定義與使用對象中數據成員和成員函數的表示方式1:11例7.1問題:對象的定義和成員函數的調用。#include<iostream.h>#include"Tpoint.h"voidmain(){TPointp1,p2;TPoint*p=&p1;p1.Setxy(1,2);cout<<"x="<<p1.Getx()<<"y="<<p1.Gety()<<endl;p2.Setxy(3,4);cout<<"x="<<p2.Getx()<<"y="<<p2.Gety()<<endl;p->Setxy(5,6);//或(*p).Setxy(5,6)cout<<"x="<<p->Getx()<<"y="<<p->Gety()<<endl;p1.Move(1,2);p2.Move(3,4);(*p).Move(5,6);//或p->Move(5,6);p1.Print();p2.Print();p->Print();}該程序的運行結果為x=1y=2x=3y=4x=5y=6x=11y=14x=6y=8x=11y=14例7.1問題:對象的定義和成員函數的調用。#include12對象定義的實質定義一個類,就相當于定義了一種類型,它并不會接受或存儲具體的值,只作為一個樣板,只有被實例化生成對象以后,系統(tǒng)才為對象分配存儲空間。為節(jié)省內存,在創(chuàng)建對象時,只為每個對象的數據成員分配內存,而成員函數只是一次性存放在靜態(tài)存儲區(qū)中,為所有的對象共享。例如:TPointp1,p2;類TPointintx,yvoidSetxy(inta,intb);voidMove(int,int);voidPrint();intGetx();intGety();p1對象intx,yp2對象intx,y對象定義的實質定義一個類,就相當于定義了一種類型,它并不會接13二、對象的初始化在類的定義中,無法用表達式初始化數據成員,因此,在聲明一個對象時,對象的初始狀態(tài)是不確定的,需要初始化。對象初始化可以使用:構造函數析構函數復制構造函數二、對象的初始化在類的定義中,無法用表達式初始化數據成員,141.構造函數構造函數是一種特殊的成員函數,它主要用來為對象分配空間,給他的數據成員賦值(初始化)并執(zhí)行對象的其他內部管理操作。說明:構造函數的名字必須與類的名字相同,并且構造函數無返回值,不允許定義構造函數的返回值類型,包括void類型。但允許有參數。構造函數是成員函數,函數體可寫在類體內,也可寫在類體外。構造函數可以重載。注意:構造函數在對象創(chuàng)建時由系統(tǒng)自動調用,這是它與類的普通成員函數之間的最大區(qū)別。構造函數的定義格式如下:<類名>::<構造函數名>{<函數體>}1.構造函數構造函數是一種特殊的成員函數,它主要用來為對象15例7.2問題:構造函數的定義舉例。#include<iostream>classTpoint{public:Tpoint(intm,intn){x=m;y=n;}//定義構造函數intGetx(){returnx;}intGety(){returny;}private:intx,y;};voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}該程序的運行結果如下:10,2015,25例7.2問題:構造函數的定義舉例。#include<io162.析構函數析構函數也是類中的特殊成員函數,與類名字相象,在前加一個波浪號“~”。它沒有參數,也沒有返回值,在一個類中只能有一個析構函數。析構函數執(zhí)行與構造函數相反的操作。通常用于釋放分配給對象的存儲空間,當程序超出類對象的作用域時,或者當對一個類指針使用運算符delete時,將自動執(zhí)行析構函數。說明:和構造函數一樣,如果不定義析構函數,編譯程序將提供一個缺省的析構函數。對大多數類來說,缺省的析構函數就能滿足要求,如果在一個對象完成其操作之前還需要做一些內部處理,則應顯式的定義析構函數。析構函數的定義格式如下:<類名>::~<析構函數名>{<函數體>}注意:析構函數僅能有一個,不能重載。2.析構函數析構函數也是類中的特殊成員函數,與類名字相象,17例7.3問題:構造函數和析構函數舉例。#include<iostream>classTpoint{public: Tpoint(intm,intn){x=m;y=n;}//定義構造函數 ~Tpoint();intGetx(){returnx;} intGety(){returny;}private:intx,y;};Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}該程序的運行結果如下:10,2015,25Destructorcalled.Destructorcalled.例7.3問題:構造函數和析構函數舉例。#include<18類的構造函數和析構函數注意:類的構造函數在程序中為對象創(chuàng)建時分配系統(tǒng)資源提供了初始化的方法;析構函數為對象撤銷時釋放系統(tǒng)資源提供了方法。無論用戶是否定義構造函數和析構函數,它們都默認存在。只要定義了新類,類的對象在創(chuàng)建和撤銷時,構造函數和析構函數將會被調用。類的構造函數和析構函數注意:類的構造函數在程序中為對象創(chuàng)建時193.復制構造函數已有變量可以初始化另一個變量:inta=5;intb=a;同樣,已有對象也可以初始化另一個對象。復制構造函數是一種特殊的成員函數,其功能是用一個已經初始化過了的對象去初始化另一個新創(chuàng)建的對象。復制構造函數的定義格式如下:<類名>::<復制構造函數名>(<類名>&<引用名>){<函數體>}注意:它只有一個參數,是對某個對象的引用。3.復制構造函數已有變量可以初始化另一個變量:20例7.4問題:調用復制構造函數的例子。#include<iostream>classTpoint{public: Tpoint(intm,intn);//定義構造函數 ~Tpoint();//定義析構函數 Tpoint(Tpoint&r);//定義復制構造函數intGetx(){returnx;}intGety(){returny;}private:intx,y;};Tpoint::Tpoint(intm,intn){cout<<"Callconstructor.\n";x=m;y=n;}Tpoint::Tpoint(Tpoint&r){cout<<"Copyconstructor.\n";x=r.x;y=r.y;}Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}例7.4問題:調用復制構造函數的例子。#include<21例7.4問題:調用復制構造函數的例子。voidmain(){Tpointa(10,20);Tpointb(15,25);Tpointc(a);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;cout<<c.Getx()<<","<<c.Gety()<<endl;}該程序的運行結果為:Callconstructor.Callconstructor.Copyconstructor.10,2015,2510,20Destructorcalled.Destructorcalled.Destructorcalled.例7.4問題:調用復制構造函數的例子。voidmain(227.3成員函數的特性成員函數除了說明和定義之外,還有一些相關的特性:內聯(lián)函數和外聯(lián)函數成員函數重載設置參數的缺省值7.3成員函數的特性成員函數除了說明和定義之外,還有一些相231.內聯(lián)函數和外聯(lián)函數類的成員函數可以分為內聯(lián)函數和外聯(lián)函數。內聯(lián)函數是指那些定義在類體內的成員函數,即該函數的函數體放在類體內。而說明在類體內,定義在類體外的成員函數叫外聯(lián)函數。外聯(lián)函數的函數體在類的實現(xiàn)部分。兩者的區(qū)別:一般函數進行調用時,要將程序執(zhí)行權轉到被調用函數中,然后再返回到調用它的函數中;而內聯(lián)函數則是在編譯時,將調用表達式用內聯(lián)函數體來替換。這樣在使用時去掉了調用環(huán)節(jié),提高運行速度。缺點:如果內聯(lián)函數代碼過大,則目標程序會加大。1.內聯(lián)函數和外聯(lián)函數類的成員函數可以分為內聯(lián)函數和外聯(lián)函數24例7.5問題:內聯(lián)函數與外聯(lián)函數實例。#include<iostream.h>classA{public:A(intm,intn)//內聯(lián)函數,定義在類體內{x=m;y=n;}intGetx(){returnx;}//內聯(lián)函數,定義在類體內intGety(){returny;}//內聯(lián)函數,定義在類體內intsumxy();//內聯(lián)函數,定義在類體外,但進行了轉化intarea();//外聯(lián)函數,定義在類體外private:intx,y;};inlineintA::sumxy()//由外聯(lián)函數轉化為內聯(lián)函數{returnGetx()+Gety();}intA::area(){returnGetx()*Gety();}voidmain(){As(10,20);cout<<"sum="<<s.sumxy()<<","<<"area="<<s.area()<<endl;}在使用內聯(lián)函數時,應注意以下幾點:(1)在內聯(lián)函數內不允許用循環(huán)語句和開關語句。(2)內聯(lián)函數的定義必須出現(xiàn)在內聯(lián)函數第一次被調用之前。(3)內聯(lián)函數無法進行遞歸調用。例7.5問題:內聯(lián)函數與外聯(lián)函數實例。#include<252.成員函數重載在前面介紹的成員函數中,除了析構函數不能重載外,其他的成員函數都可以進行重載。但重載必須滿足以下條件之一:參數個數不同。參數類型不同。當參數個數相同時,參數類型至少有一個不同。僅有返回值不同的函數是不能重載的。2.成員函數重載在前面介紹的成員函數中,除了析構函數不能重26例7.6問題:成員函數重載實例。#include<iostream.h>classB{public:B(inta){x=a+1;y=a;}B(inta,intb){x=a;y=b;}intadd();intadd(inta);intadd(inta,intb);intGetx(){returnx;}intGety(){returny;}private:intx,y;};intB::add(){returnx+y;}intB::add(inta){x=y=a;returnx+y;}intB::add(inta,intb){x=a;y=b;returnx+y;}例7.6問題:成員函數重載實例。#include<iost27例7.6問題:成員函數重載實例。voidmain(){Bm(5,7),n(6);cout<<"m="<<m.Getx()<<","<<m.Gety()<<endl;cout<<"n="<<n.Getx()<<","<<n.Gety()<<endl;inti=m.add();intj=m.add(1,2);intk=n.add(4);cout<<i<<endl<<j<<endl<<k<<endl;}該程序的運行結果為:m=5,7n=7,61238例7.6問題:成員函數重載實例。voidmain()該程283.設置參數的缺省值成員函數和普通函數一樣,可以設置參數的缺省值。一般的成員函數和構造函數都可以被設置參數的缺省值。3.設置參數的缺省值成員函數和普通函數一樣,可以設置參數的29例7.7問題:設置默認參數應用舉例。#include<iostream>usingnamespacestd;classB{public: B(inta=10,intb=20,intc=30); intGetx(){returnx;} intGety(){returny;}
intGetz(){returnz;}private:intx,y,z;};B::B(inta,intb,intc){x=a;y=b;z=c;}例7.7問題:設置默認參數應用舉例。#include<io30例7.7問題:設置默認參數應用舉例。voidmain(){Bi,j(1),k(1,2),r(1,2,3);cout<<"i="<<i.Getx()<<""<<i.Gety()<<""<<i.Getz()<<endl;cout<<"j="<<j.Getx()<<""<<j.Gety()<<""<<j.Getz()<<endl;cout<<"k="<<k.Getx()<<""<<k.Gety()<<""<<k.Getz()<<endl;cout<<"r="<<r.Getx()<<""<<r.Gety()<<""<<r.Getz()<<endl;}該程序的運行結果為:i=102030j=12030k=1230r=123例7.7問題:設置默認參數應用舉例。voidmain()31四、靜態(tài)成員靜態(tài)成員可以實現(xiàn)多個對象之間的數據共享,并且使用靜態(tài)成員還不會破壞隱藏的原則,保證了安全性。靜態(tài)數據成員靜態(tài)成員函數四、靜態(tài)成員靜態(tài)成員可以實現(xiàn)多個對象之間的數據共享,并且使321.靜態(tài)數據成員靜態(tài)數據成員是類的所有對象中共享的成員,而不是某個對象的成員。彌補了全局變量的不足,它相對于類中的“全局變量”。注意:靜態(tài)成員所占空間不會隨著對象的產生而分配,隨著對象的消失而回收。1.靜態(tài)數據成員靜態(tài)數據成員是類的所有對象中共享的成員,而33例7.8問題:靜態(tài)數據成員定義。#include<iostream>usingnamespacestd;classtime{public:time(int,int);voiddisplay();private: staticinthour;//hour是一個靜態(tài)數據成員。intminute;intsecond;};例7.8問題:靜態(tài)數據成員定義。#include<ios34例7.8問題:靜態(tài)數據成員定義。time::time(intm,ints):minute(m),second(s){};inttime::hour=15;voidtime::display(){cout<<hour<<":"<<minute<<":"<<second<<endl;}voidmain(){timet1(06,20),t2(10,30);t1.display();t2.display();}該程序的運行結果為:15:6:2015:10:30例7.8問題:靜態(tài)數據成員定義。time::time(in35說明:靜態(tài)數據成員的初始化應在類體外進行,其格式如下:<數據類型><類名>::<靜態(tài)數據成員名>=<初值>例如,inttime::hour=15;在數據成員前不加static,而應使用作用域運算符來表明所屬類。在程序中如果靜態(tài)數據成員的訪問權限為公有(public)成員,則可按如下格式引用:<類名>::<靜態(tài)成員名>//前面直接用類名靜態(tài)數據成員被存放在靜態(tài)存儲區(qū)。說明:靜態(tài)數據成員的初始化應在類體外進行,其格式如下:362.靜態(tài)成員函數在靜態(tài)成員函數的實現(xiàn)中,可以直接引用靜態(tài)成員,但不能直接引用非靜態(tài)成員,如果要引用非靜態(tài)成員時,可通過對象來引用。對靜態(tài)成員函數的引用,在程序中一般使用下列格式:類名.靜態(tài)成員函數(參數表)有時,也可以由對象來引用,格式如下:對象.靜態(tài)成員函數(參數表)2.靜態(tài)成員函數在靜態(tài)成員函數的實現(xiàn)中,可以直接引用靜態(tài)成37例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。#include<iostream.h>classtest{public:test(inta){A=a;B+=a;}
staticvoidf(testm);
//靜態(tài)公有成員函數聲明private:
intA;
staticintB;//靜態(tài)私有成員};例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。#inclu38例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。inttest::B=0;//靜態(tài)成員初始化voidtest::f(testm){cout<<"A="<<m.A<<endl;//引用類的非靜態(tài)成員,用對象引用cout<<"B="<<B<<endl;//引用類的靜態(tài)成員,直接引用}voidmain(){testX(10),Y(20);test::f(X);//調用靜態(tài)成員函數test::f(Y);//調用靜態(tài)成員函數}該程序的運行結果為:例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。intte39靜態(tài)成員函數的使用注意:只能訪問類的靜態(tài)數據成員,而不能直接訪問類中的普通成員(需用點域法)靜態(tài)成員函數與類相聯(lián)系,而不與類的對象相聯(lián)系,所以在類的外部調用類中的公有靜態(tài)成員函數,必須在其左面加"類名::",而不是通過對象名調用公有靜態(tài)成員函數。在類的外部不能調用類中的私有靜態(tài)成員函數。靜態(tài)成員函數的使用注意:只能訪問類的靜態(tài)數據成員,而不能直接40五、友元為了方便類內數據的訪問,提出友元方案。兩種形式友元函數友元類特點:破壞了類的封閉性和隱藏性,但是提高了程序的運行效率。五、友元為了方便類內數據的訪問,提出友元方案。411.友元函數友元函數是定義在類外部的普通函數,但對它的說明是在類內部,在友元函數的說明前加關鍵字friend。友元函數說明格式:friend類型友元函數名(參數表);在類外定義友元函數的格式:類型函數名(類&對象);注意:友元函數不是成員函數,但可以訪問類中的私有成員。聲明可在私有部分,也可在公有部分,作用相同。友元函數的調用方式于普通函數相同。1.友元函數友元函數是定義在類外部的普通函數,但對它的說明是42Private:成員……public:pubf();……f()外部函數間接訪問Private:成員……public:pubf();friendf();……f()友元函數指定友元關系直接訪問無友元關系有友元關系友元函數關系示意圖Private:f()外部函數間接訪問Private:f(43例7.10問題:友元函數與普通函數。#include<iostream>usingnamespacestd;classStudent{private:intx;friendvoidgetf(Student&s);//在類中聲明友元函數getf()};voidgetf(Student&s)//定義友元函數{s.x=10;
//友元函數通過對象引用類的私有成員cout<<s.x<<endl;}voidmain(){Students;getf(s);//調用該友元函數}該程序的運行結果為:10例7.10問題:友元函數與普通函數。#include<io44例7.10問題:友元函數與普通函數。#include<iostream>usingnamespacestd;classStudent{private:intx;public:voidget()
//成員函數{x=20;cout<<x<<endl;}};voidmain(){Students;s.get();}該程序的運行結果為:20例7.10問題:友元函數與普通函數。#include<io452.友元類當希望一個類可以存取另一個類的私有成員時,可以將該類聲明為另一個類的友元類。此時,該類的所有成員函數都可以訪問另一個類中的所有成員。定義友元類的語句格式如下:friendclass<類名>;其中:friend和class是關鍵字,類名必須是程序中的一個已定義過的類。2.友元類當希望一個類可以存取另一個類的私有成員時,可以將該46類X……friendclassY;類Y友元非友元使用友元類注意事項:類X類YfriendclassX;類ZfriendclassY;友元友元非友元是單向的。如類A是類B的友元,但類B并不是類A的友元。不具有傳遞性。若類X是類Y的友元,類Y是類Z的友元,但類X不是類Z的友元。類X類Y友元非友元使用友元類注意事項:類X類Y類Z友元友元非47例7.11問題:友元類實例。#include<iostream>usingnamespacestd;classX;classY{public:Y(){strcpy(cname,"計算機語言");}voidprint(){cout<<cname<<endl;}
friendclassX;//友元類的聲明private:charcname[30];};例7.11問題:友元類實例。#include<iostr48例7.11問題:友元類實例。classX{public:X(char*na,char*ena)
{strcpy(X::name,na);strcpy(X::ename,ena);}voidEditcname(Y&temp);
voidprint(){cout<<name<<endl;cout<<ename<<endl;}private:charname[20];charename[30];};voidX::Editcname(Y&temp){strcpy(ame,"計算機高級語言");}例7.11問題:友元類實例。classX49例7.11問題:友元類實例。voidmain(){
Xa("C++語言程序設計",
"TheC++ProgrammingLanguage.");Yb;a.Editcname(b);a.print(); b.print();}該程序的運行結果為:C++語言程序設計TheC++ProgrammingLanguage.計算機高級語言例7.11問題:友元類實例。voidmain()該程序的50六、類的作用域類的作用域簡稱類域,它是指類的定義和相應成員函數的定義范圍。注意:一個類在類域內對任何成員都是開放的,而對類域外的類或函數的訪問受到限制。在類域中定義的變量不能使用auto,register和extern等修飾符,只能用static修飾符,而定義的函數也不能用extern修飾符。類本身可被定義在三種作用域內:全局作用域。(一般的C++類)在另一個類的作用域中。(嵌套類)在一個塊的局部作用域中。(局部類)六、類的作用域類的作用域簡稱類域,它是指類的定義和相應成員函51例問題:全局作用域。intfork(void);//全局fork函數classProcess{intfork(void);......};成員函數fork隱藏了全局函數fork,前者能通過單目域運算符調用后者:intProcess::fork(void){intpid=::fork();//調用全局fork函數......}例問題:全局作用域。intfork(void);52例問題:嵌套類的例子。classRectangle{public:Rectangle(int,int,int,int);……private:
classPoint
{public:Point(int,int);private:intx,y;};PointtopLeft,botRight;};Rectangle::Point::Point(intx,inty)
{
…...
}同樣,在類域外訪問嵌套類需要限制類名,例如:Rectangle::Pointpt(1,1);例問題:嵌套類的例子。classRectangle53例問題:局部類的例子。voidRender(Image&image){classColorTable{public:ColorTable(void){/*...*/}AddEntry(intr,intg,intb){/*...*/}…...};ColorTablecolors;…...}例問題:局部類的例子。voidRender(Image54例問題:綜合例子。classa{
intx;
//類變量x說明public:
intfun();
//類成員函數fun()說明}intx;
//全局變量x的說明intfun();
//全局函數fun()的說明inta::fun()
//類a中fun()成員函數的定義
{
::x++;
//全局變量x,必須用“::”來引用
returnx;
//類的成員x
}例問題:綜合例子。classa552.對象的生存期不同存儲的對象生存期不同。對象的生存期是指對象從被創(chuàng)建開始到被釋放為止的時間。按生存期的不同對象可分為如下三種:局部對象靜態(tài)對象全局對象2.對象的生存期不同存儲的對象生存期不同。對象的生存期是指561.局部對象當對象被定義時調用構造函數,該對象被創(chuàng)建;當程序退出定義該對象所在的函數體或程序塊時,調用析構函數,釋放該對象。注意:一般定義在一個函數體或程序塊內,它的作用域小,生存期短。1.局部對象當對象被定義時調用構造函數,該對象被創(chuàng)建;572.靜態(tài)對象當程序第一次執(zhí)行所定義的靜態(tài)對象時,該對象被創(chuàng)建,當程序結束時,該對象被釋放。注意:定義在一個文件中,它的作用域從定義時起到文件結束時止。2.靜態(tài)對象當程序第一次執(zhí)行所定義的靜態(tài)對象時,該對象被創(chuàng)建583.全局對象當程序開始時,調用構造函數創(chuàng)建該對象。當程序結束時調用析構函數釋放該對象。注意:被定義在某個文件中,它的作用域在包含該文件的整個程序中。3.全局對象當程序開始時,調用構造函數創(chuàng)建該對象。59例7.12問題:不同對象生存期實例。#include<iostream.h>classA{public:A(int);~A();private:intx;};A::A(inta){x=a;cout<<"Thenumberis:"<<x<<endl;}A::~A(){cout<<"Destructorcalledno."<<x<<endl;}例7.12問題:不同對象生存期實例。#include<io60例7.12問題:不同對象生存期實例。voidf1(){AA5(5);//局部對象cout<<"Inf1()"<<endl;}AA1(1);
//全局對象staticAA2(2);
//外部靜態(tài)對象voidmain(){staticAA3(3);
//內部靜態(tài)對象AA4(4);
//局部對象cout<<"Inmain()beforecallf1."<<endl;f1();cout<<"Inmain()aftercallf1."<<endl;}該程序的運行結果為:Thenumberis:1Thenumberis:2Thenumberis:3Thenumberis:4Inmain()beforecallf1.Thenumberis:5Inf1()Destructorcalledno.5Inmain()aftercallf1.Destructorcalledno.4Destructorcalledno.3Destructorcalledno.2Destructorcalledno.1例7.12問題:不同對象生存期實例。voidf1()該程61小結類是一種復雜的數據類型,它是抽象數據類型的實現(xiàn),是數據和相關操作的封裝體.類的定義分兩部分:說明和實現(xiàn)對象是類的一個實例,它是屬于某個已知類的。小結類是一種復雜的數據類型,它是抽象數據類型的實現(xiàn),是數據和62第7章類和對象的基礎第7章類和對象的基礎63本章內容提要類與對象的定義對象的初始化成員函數的特性靜態(tài)成員友元類的作用域與對象的生存期本章內容提要類與對象的定義64一、類與對象的定義什么是類?類是一種新的數據類型。類是邏輯相關的函數和數據的封裝,是對所處理的問題的抽象描述,所以,類是實現(xiàn)抽象類型的工具。類(Class):是一種用戶定義的類型,它包括定義的數據和其對應的操作(函數)。使用對象將數據和操作進行封裝(Encapsulation)。一、類與對象的定義什么是類?65什么是對象?類實例化后便生成對象。對象(Object):含有數據(對象的屬性Attribute)又含有對數據的操作代碼(Method)的一個邏輯封裝體。屬性:描述對象特征的數據。方法:對屬性的操作。面向對象編程利用對象進行程序設計什么是對象?類實例化后便生成對象。661.類的定義類的定義一般分為說明部分和實現(xiàn)部分。說明部分:類中的成員數據成員成員函數的說明實現(xiàn)部分成員函數的具體定義例如:定義一個汽車類型號、外殼、車輪等(數據成員)啟動、加速和停止等(成員函數)1.類的定義類的定義67類的定義格式:class<類名>{
public:
<公有數據成員和成員函數的說明或實現(xiàn)>
private:
<私有數據成員和成員函數的說明或實現(xiàn)>protected:<保護數據成員和成員函數的說明或實現(xiàn)>};
<各個成員函數的實現(xiàn)>類的定義格式:class<類名>68例:坐標點類問題:將坐標點與相應操作封裝成類classTPoint{
public:
voidSetxy(inta,intb);//說明在類體內,定義在類體外
voidMove(int,int);//函數原型聲明,參數名可給可不給出
voidPrint();intGetx();intGety();
private:
intx,y;//數據成員};
例:坐標點類問題:將坐標點與相應操作封裝成類classT69例:坐標點類(續(xù)上)問題:將坐標點與相應操作封裝成類voidTPoint::Setxy(inta,intb){
x=a;y=b;}voidTPoint:move(inta,intb){
x=x+a;y=y+b;}voidTPoint::Print();{
cout<<"x="<<Getx()<<"y="<<Gety();}intTPoint::Getx(){returnx;}intTPoint::Gety(){returny;}在類體外定義成員函數的一般格式為:<函數類型><類名>::<成員函數>(<參數表>){<函數體>}其中,作用域運算符“::”是用來標識成員函數是屬于哪個類的,
“類名”是成員函數所屬類的名字。若在函數前加關鍵詞inline,
則成為內聯(lián)成員函數。若函數較短,可以在類內定義,也稱作
內聯(lián)成員函數。例:坐標點類(續(xù)上)問題:將坐標點與相應操作封裝成類voi70例:坐標點類(內聯(lián)函數形式)問題:將說明部分和實現(xiàn)部分都在類體內定義。classTPoint//類名{
public://聲明其后為公有成員
voidSetxy(inta,intb){x=a;y=b;}voidMove(inta,intb){x=x+a;y=y+b;}voidPrint(){cout<<"x="<<Getx()<<"y="<<Gety();}intGetx(){returnx;}intGety(){returny;}
private:
intx,y;//數據成員};
例:坐標點類(內聯(lián)函數形式)問題:將說明部分和實現(xiàn)部分都在712.對象的定義與使用對象的定義格式:
<類名><對象名列表>說明:<類名>是定義對象所屬類的名字。<對象名列表>可有多個對象名,用逗號分隔。例如:TPointp1,p2;//定義TPoint類型的對象p1和p2。TPoint*p=&p1;//定義指向對象p1的TPoint類型的指針p。TPoint&c=p2;//定義c為TPoint類型對象p2的引用。TPointm[5];//定義一個TPoint類型的對象數組。2.對象的定義與使用對象的定義格式:
<類名><對象722.對象的定義與使用對象中數據成員和成員函數的表示方式1:<對象名>.<成員名><對象名>.<成員名>(<參數表>)例如:p1.x,p1.y,p1.Setxy(2,3)對象中數據成員和成員函數的表示方式2:<對象指針名>-><成員名>或者(*<對象指針名>).<成員名><對象指針名>-><成員名>(<參數表>)或者(*<對象指針名>).<成員名>(<參數表>)例如:p->x,p->y,p->Getxy(inta,intb)或者(*p).x,(*p).y,(*p).Getxy(inta,intb)2.對象的定義與使用對象中數據成員和成員函數的表示方式1:73例7.1問題:對象的定義和成員函數的調用。#include<iostream.h>#include"Tpoint.h"voidmain(){TPointp1,p2;TPoint*p=&p1;p1.Setxy(1,2);cout<<"x="<<p1.Getx()<<"y="<<p1.Gety()<<endl;p2.Setxy(3,4);cout<<"x="<<p2.Getx()<<"y="<<p2.Gety()<<endl;p->Setxy(5,6);//或(*p).Setxy(5,6)cout<<"x="<<p->Getx()<<"y="<<p->Gety()<<endl;p1.Move(1,2);p2.Move(3,4);(*p).Move(5,6);//或p->Move(5,6);p1.Print();p2.Print();p->Print();}該程序的運行結果為x=1y=2x=3y=4x=5y=6x=11y=14x=6y=8x=11y=14例7.1問題:對象的定義和成員函數的調用。#include74對象定義的實質定義一個類,就相當于定義了一種類型,它并不會接受或存儲具體的值,只作為一個樣板,只有被實例化生成對象以后,系統(tǒng)才為對象分配存儲空間。為節(jié)省內存,在創(chuàng)建對象時,只為每個對象的數據成員分配內存,而成員函數只是一次性存放在靜態(tài)存儲區(qū)中,為所有的對象共享。例如:TPointp1,p2;類TPointintx,yvoidSetxy(inta,intb);voidMove(int,int);voidPrint();intGetx();intGety();p1對象intx,yp2對象intx,y對象定義的實質定義一個類,就相當于定義了一種類型,它并不會接75二、對象的初始化在類的定義中,無法用表達式初始化數據成員,因此,在聲明一個對象時,對象的初始狀態(tài)是不確定的,需要初始化。對象初始化可以使用:構造函數析構函數復制構造函數二、對象的初始化在類的定義中,無法用表達式初始化數據成員,761.構造函數構造函數是一種特殊的成員函數,它主要用來為對象分配空間,給他的數據成員賦值(初始化)并執(zhí)行對象的其他內部管理操作。說明:構造函數的名字必須與類的名字相同,并且構造函數無返回值,不允許定義構造函數的返回值類型,包括void類型。但允許有參數。構造函數是成員函數,函數體可寫在類體內,也可寫在類體外。構造函數可以重載。注意:構造函數在對象創(chuàng)建時由系統(tǒng)自動調用,這是它與類的普通成員函數之間的最大區(qū)別。構造函數的定義格式如下:<類名>::<構造函數名>{<函數體>}1.構造函數構造函數是一種特殊的成員函數,它主要用來為對象77例7.2問題:構造函數的定義舉例。#include<iostream>classTpoint{public:Tpoint(intm,intn){x=m;y=n;}//定義構造函數intGetx(){returnx;}intGety(){returny;}private:intx,y;};voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}該程序的運行結果如下:10,2015,25例7.2問題:構造函數的定義舉例。#include<io782.析構函數析構函數也是類中的特殊成員函數,與類名字相象,在前加一個波浪號“~”。它沒有參數,也沒有返回值,在一個類中只能有一個析構函數。析構函數執(zhí)行與構造函數相反的操作。通常用于釋放分配給對象的存儲空間,當程序超出類對象的作用域時,或者當對一個類指針使用運算符delete時,將自動執(zhí)行析構函數。說明:和構造函數一樣,如果不定義析構函數,編譯程序將提供一個缺省的析構函數。對大多數類來說,缺省的析構函數就能滿足要求,如果在一個對象完成其操作之前還需要做一些內部處理,則應顯式的定義析構函數。析構函數的定義格式如下:<類名>::~<析構函數名>{<函數體>}注意:析構函數僅能有一個,不能重載。2.析構函數析構函數也是類中的特殊成員函數,與類名字相象,79例7.3問題:構造函數和析構函數舉例。#include<iostream>classTpoint{public: Tpoint(intm,intn){x=m;y=n;}//定義構造函數 ~Tpoint();intGetx(){returnx;} intGety(){returny;}private:intx,y;};Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}該程序的運行結果如下:10,2015,25Destructorcalled.Destructorcalled.例7.3問題:構造函數和析構函數舉例。#include<80類的構造函數和析構函數注意:類的構造函數在程序中為對象創(chuàng)建時分配系統(tǒng)資源提供了初始化的方法;析構函數為對象撤銷時釋放系統(tǒng)資源提供了方法。無論用戶是否定義構造函數和析構函數,它們都默認存在。只要定義了新類,類的對象在創(chuàng)建和撤銷時,構造函數和析構函數將會被調用。類的構造函數和析構函數注意:類的構造函數在程序中為對象創(chuàng)建時813.復制構造函數已有變量可以初始化另一個變量:inta=5;intb=a;同樣,已有對象也可以初始化另一個對象。復制構造函數是一種特殊的成員函數,其功能是用一個已經初始化過了的對象去初始化另一個新創(chuàng)建的對象。復制構造函數的定義格式如下:<類名>::<復制構造函數名>(<類名>&<引用名>){<函數體>}注意:它只有一個參數,是對某個對象的引用。3.復制構造函數已有變量可以初始化另一個變量:82例7.4問題:調用復制構造函數的例子。#include<iostream>classTpoint{public: Tpoint(intm,intn);//定義構造函數 ~Tpoint();//定義析構函數 Tpoint(Tpoint&r);//定義復制構造函數intGetx(){returnx;}intGety(){returny;}private:intx,y;};Tpoint::Tpoint(intm,intn){cout<<"Callconstructor.\n";x=m;y=n;}Tpoint::Tpoint(Tpoint&r){cout<<"Copyconstructor.\n";x=r.x;y=r.y;}Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}例7.4問題:調用復制構造函數的例子。#include<83例7.4問題:調用復制構造函數的例子。voidmain(){Tpointa(10,20);Tpointb(15,25);Tpointc(a);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;cout<<c.Getx()<<","<<c.Gety()<<endl;}該程序的運行結果為:Callconstructor.Callconstructor.Copyconstructor.10,2015,2510,20Destructorcalled.Destructorcalled.Destructorcalled.例7.4問題:調用復制構造函數的例子。voidmain(847.3成員函數的特性成員函數除了說明和定義之外,還有一些相關的特性:內聯(lián)函數和外聯(lián)函數成員函數重載設置參數的缺省值7.3成員函數的特性成員函數除了說明和定義之外,還有一些相851.內聯(lián)函數和外聯(lián)函數類的成員函數可以分為內聯(lián)函數和外聯(lián)函數。內聯(lián)函數是指那些定義在類體內的成員函數,即該函數的函數體放在類體內。而說明在類體內,定義在類體外的成員函數叫外聯(lián)函數。外聯(lián)函數的函數體在類的實現(xiàn)部分。兩者的區(qū)別:一般函數進行調用時,要將程序執(zhí)行權轉到被調用函數中,然后再返回到調用它的函數中;而內聯(lián)函數則是在編譯時,將調用表達式用內聯(lián)函數體來替換。這樣在使用時去掉了調用環(huán)節(jié),提高運行速度。缺點:如果內聯(lián)函數代碼過大,則目標程序會加大。1.內聯(lián)函數和外聯(lián)函數類的成員函數可以分為內聯(lián)函數和外聯(lián)函數86例7.5問題:內聯(lián)函數與外聯(lián)函數實例。#include<iostream.h>classA{public:A(intm,intn)//內聯(lián)函數,定義在類體內{x=m;y=n;}intGetx(){returnx;}//內聯(lián)函數,定義在類體內intGety(){returny;}//內聯(lián)函數,定義在類體內intsumxy();//內聯(lián)函數,定義在類體外,但進行了轉化intarea();//外聯(lián)函數,定義在類體外private:intx,y;};inlineintA::sumxy()//由外聯(lián)函數轉化為內聯(lián)函數{returnGetx()+Gety();}intA::area(){returnGetx()*Gety();}voidmain(){As(10,20);cout<<"sum="<<s.sumxy()<<","<<"area="<<s.area()<<endl;}在使用內聯(lián)函數時,應注意以下幾點:(1)在內聯(lián)函數內不允許用循環(huán)語句和開關語句。(2)內聯(lián)函數的定義必須出現(xiàn)在內聯(lián)函數第一次被調用之前。(3)內聯(lián)函數無法進行遞歸調用。例7.5問題:內聯(lián)函數與外聯(lián)函數實例。#include<872.成員函數重載在前面介紹的成員函數中,除了析構函數不能重載外,其他的成員函數都可以進行重載。但重載必須滿足以下條件之一:參數個數不同。參數類型不同。當參數個數相同時,參數類型至少有一個不同。僅有返回值不同的函數是不能重載的。2.成員函數重載在前面介紹的成員函數中,除了析構函數不能重88例7.6問題:成員函數重載實例。#include<iostream.h>classB{public:B(inta){x=a+1;y=a;}B(inta,intb){x=a;y=b;}intadd();intadd(inta);intadd(inta,intb);intGetx(){returnx;}intGety(){returny;}private:intx,y;};intB::add(){returnx+y;}intB::add(inta){x=y=a;returnx+y;}intB::add(inta,intb){x=a;y=b;returnx+y;}例7.6問題:成員函數重載實例。#include<iost89例7.6問題:成員函數重載實例。voidmain(){Bm(5,7),n(6);cout<<"m="<<m.Getx()<<","<<m.Gety()<<endl;cout<<"n="<<n.Getx()<<","<<n.Gety()<<endl;inti=m.add();intj=m.add(1,2);intk=n.add(4);cout<<i<<endl<<j<<endl<<k<<endl;}該程序的運行結果為:m=5,7n=7,61238例7.6問題:成員函數重載實例。voidmain()該程903.設置參數的缺省值成員函數和普通函數一樣,可以設置參數的缺省值。一般的成員函數和構造函數都可以被設置參數的缺省值。3.設置參數的缺省值成員函數和普通函數一樣,可以設置參數的91例7.7問題:設置默認參數應用舉例。#include<iostream>usingnamespacestd;classB{public: B(inta=10,intb=20,intc=30); intGetx(){returnx;} intGety(){returny;}
intGetz(){returnz;}private:intx,y,z;};B::B(inta,intb,intc){x=a;y=b;z=c;}例7.7問題:設置默認參數應用舉例。#include<io92例7.7問題:設置默認參數應用舉例。voidmain(){Bi,j(1),k(1,2),r(1,2,3);cout<<"i="<<i.Getx()<<""<<i.Gety()<<""<<i.Getz()<<endl;cout<<"j="<<j.Getx()<<""<<j.Gety()<<""<<j.Getz()<<endl;cout<<"k="<<k.Getx()<<""<<k.Gety()<<""<<k.Getz()<<endl;cout<<"r="<<r.Getx()<<""<<r.Gety()<<""<<r.Getz()<<endl;}該程序的運行結果為:i=102030j=12030k=1230r=123例7.7問題:設置默認參數應用舉例。voidmain()93四、靜態(tài)成員靜態(tài)成員可以實現(xiàn)多個對象之間的數據共享,并且使用靜態(tài)成員還不會破壞隱藏的原則,保證了安全性。靜態(tài)數據成員靜態(tài)成員函數四、靜態(tài)成員靜態(tài)成員可以實現(xiàn)多個對象之間的數據共享,并且使941.靜態(tài)數據成員靜態(tài)數據成員是類的所有對象中共享的成員,而不是某個對象的成員。彌補了全局變量的不足,它相對于類中的“全局變量”。注意:靜態(tài)成員所占空間不會隨著對象的產生而分配,隨著對象的消失而回收。1.靜態(tài)數據成員靜態(tài)數據成員是類的所有對象中共享的成員,而95例7.8問題:靜態(tài)數據成員定義。#include<iostream>usingnamespacestd;classtime{public:time(int,int);voiddisplay();private: staticinthour;//hour是一個靜態(tài)數據成員。intminute;intsecond;};例7.8問題:靜態(tài)數據成員定義。#include<ios96例7.8問題:靜態(tài)數據成員定義。time::time(intm,ints):minute(m),second(s){};inttime::hour=15;voidtime::display(){cout<<hour<<":"<<minute<<":"<<second<<endl;}voidmain(){timet1(06,20),t2(10,30);t1.display();t2.display();}該程序的運行結果為:15:6:2015:10:30例7.8問題:靜態(tài)數據成員定義。time::time(in97說明:靜態(tài)數據成員的初始化應在類體外進行,其格式如下:<數據類型><類名>::<靜態(tài)數據成員名>=<初值>例如,inttime::hour=15;在數據成員前不加static,而應使用作用域運算符來表明所屬類。在程序中如果靜態(tài)數據成員的訪問權限為公有(public)成員,則可按如下格式引用:<類名>::<靜態(tài)成員名>//前面直接用類名靜態(tài)數據成員被存放在靜態(tài)存儲區(qū)。說明:靜態(tài)數據成員的初始化應在類體外進行,其格式如下:982.靜態(tài)成員函數在靜態(tài)成員函數的實現(xiàn)中,可以直接引用靜態(tài)成員,但不能直接引用非靜態(tài)成員,如果要引用非靜態(tài)成員時,可通過對象來引用。對靜態(tài)成員函數的引用,在程序中一般使用下列格式:類名.靜態(tài)成員函數(參數表)有時,也可以由對象來引用,格式如下:對象.靜態(tài)成員函數(參數表)2.靜態(tài)成員函數在靜態(tài)成員函數的實現(xiàn)中,可以直接引用靜態(tài)成99例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。#include<iostream.h>classtest{public:test(inta){A=a;B+=a;}
staticvoidf(testm);
//靜態(tài)公有成員函數聲明private:
intA;
staticintB;//靜態(tài)私有成員};例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。#inclu100例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。inttest::B=0;//靜態(tài)成員初始化voidtest::f(testm){cout<<"A="<<m.A<<endl;//引用類的非靜態(tài)成員,用對象引用cout<<"B="<<B<<endl;//引用類的靜態(tài)成員,直接引用}voidmain(){testX(10),Y(20);test::f(X);//調用靜態(tài)成員函數test::f(Y);//調用靜態(tài)成員函數}該程序的運行結果為:例7.9問題:靜態(tài)成員函數對非靜態(tài)成員的引用。intte101靜態(tài)成員函數的使用注意:只能訪問類的靜態(tài)數據成員,而不能直接訪問類中的普通成員(需用點域法)靜態(tài)成員函數與類相聯(lián)系,而不與類的對象相聯(lián)系,所以在類的外部調用類中的公有靜態(tài)成員函數,必須在其左面加"類名::",而不是通過對象名調用公有靜態(tài)成員函數。在類的外部不能調用類中的私有靜態(tài)成員函數。靜態(tài)成員函數的使用注意:只能訪問類的靜態(tài)數據成員,而不能直接102五、友元為了方便類內數據的訪問,提出友元方案。兩種形式友元函數友元類特點:破壞了類的封閉性和隱藏性,但是提高了程序的運行效率。五、友元為了方便類內數據的訪問,提出友元方案。1031.友元函數友元函數是定義在類外部的普通函數,但對它的說明是在類內部,在友元函數的說明前加關鍵字friend。友元函數說明格式:friend類型友元函數名(參數表);在類外定義友元函數的格式:類型函數名(類&對象);注意:友元函數不是成員函數,但可以訪問類中的私有成員。聲明可在私有部分,也可在公有部分,作用相同。友元函數的調用方式于普通函數相同。1.友元函數友元函數是定義在類外部的普通函數,但對它的說明是104Private:成員……public:pubf();……f()外部函數間接訪問Private:成員……public:pubf();friendf();……f()友元函數指定友元關系直接訪問無友元關系有友元關系友元函數關系示意圖Private:f()外部函數間接訪問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 案件和解保密協(xié)議書
- 法律賠償免責協(xié)議書
- 期權投資股權協(xié)議書
- 海運貨物代理協(xié)議書
- 施工工期延長協(xié)議書
- 游客投訴賠償協(xié)議書
- 材料使用管理協(xié)議書
- 泡椒供貨合同協(xié)議書
- 景區(qū)展覽合作協(xié)議書
- 早餐攤位管理協(xié)議書
- 2025年鄉(xiāng)村振興戰(zhàn)略相關考試試題及答案
- 2025防撞緩沖車標準
- 中職ps期末考試試卷及答案
- 高溫下質子交換膜燃料電池密封墊泄漏機理分析
- 廉潔課件教學課件
- 幼兒園管理 試題及答案
- 江蘇省南京市、鹽城市2025屆高三年級5月第二次模擬考試英語試題及答案(南京鹽城二模)
- 光催化反應的化學機理試題及答案
- 2025-2030年中國科技金融行業(yè)前景預測及投資戰(zhàn)略規(guī)劃研究報告
- 美育課程中的跨學科融合教學實踐
- 2024年湖北省竹溪縣事業(yè)單位公開招聘醫(yī)療衛(wèi)生崗筆試題帶答案
評論
0/150
提交評論