內(nèi)聯(lián)函數(shù)和虛函數(shù)_第1頁(yè)
內(nèi)聯(lián)函數(shù)和虛函數(shù)_第2頁(yè)
內(nèi)聯(lián)函數(shù)和虛函數(shù)_第3頁(yè)
內(nèi)聯(lián)函數(shù)和虛函數(shù)_第4頁(yè)
內(nèi)聯(lián)函數(shù)和虛函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、內(nèi)聯(lián)函數(shù):定義內(nèi)聯(lián)函數(shù)從源代碼層看,有函數(shù)的結(jié)構(gòu),而在編譯后,卻不具備函數(shù)的性質(zhì)。編譯時(shí),類(lèi)似宏替換,使用函數(shù)體替換調(diào)用處的函數(shù)名。一般在代碼中用inline修飾,但是否能形成內(nèi)聯(lián)函數(shù),需要看編譯器對(duì)該函數(shù)定義的具體處理。 實(shí)現(xiàn)有兩種實(shí)現(xiàn)方式: 1.在類(lèi)聲明的內(nèi)部聲明,而在類(lèi)聲明外部定義叫做顯式內(nèi)聯(lián)函數(shù),如: class display int t; public: void output(void);display object; inline void display:output(void) cout << "i is " << i <&

2、lt;"n" 2.在類(lèi)聲明的內(nèi)部定義,叫做隱式內(nèi)聯(lián)函數(shù),如: class display int t; public: inline void output(void) cout<<"i is "<< i << "n" 實(shí)際應(yīng)用引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問(wèn)題。 函數(shù)是一種更高級(jí)的抽象。它的引入使得編程者只關(guān)心函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)功能的具體實(shí)現(xiàn);函數(shù)的引入可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼和數(shù)據(jù)的共享。但是,函數(shù)調(diào)用也會(huì)帶來(lái)降低效率的問(wèn)題,因?yàn)檎{(diào)用函數(shù)實(shí)際上將程

3、序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個(gè)地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去前要保護(hù)現(xiàn)場(chǎng)并記憶執(zhí)行的地址,轉(zhuǎn)回后先要恢復(fù)現(xiàn)場(chǎng),并按原來(lái)保存地址繼續(xù)執(zhí)行。因此,函數(shù)調(diào)用要有一定的時(shí)間和空間方面的開(kāi)銷(xiāo),于是將影響其效率。特別是對(duì)于一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)來(lái)講,解決其效率問(wèn)題更為重要。引入內(nèi)聯(lián)函數(shù)實(shí)際上就是為了解決這一問(wèn)題。 在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)進(jìn)行替換。顯然,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問(wèn)題,但是由于在編譯時(shí)函數(shù)體中的代碼被替代到程序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開(kāi)

4、銷(xiāo),而在時(shí)間開(kāi)銷(xiāo)上不象函數(shù)調(diào)用時(shí)那么大,可見(jiàn)它是以目標(biāo)代碼的增加為代價(jià)來(lái)?yè)Q取時(shí)間的節(jié)省。 在程序中,調(diào)用其函數(shù)時(shí),該函數(shù)在編譯時(shí)被替代,而不是像一般函數(shù)那樣是在運(yùn)行時(shí)被調(diào)用。 注意事項(xiàng)使用內(nèi)聯(lián)函數(shù)應(yīng)注意的事項(xiàng) 內(nèi)聯(lián)函數(shù)具有一般函數(shù)的特性,它與一般函數(shù)所不同之處只在于函數(shù)調(diào)用的處理。一般函數(shù)進(jìn)行調(diào)用時(shí),要將程序執(zhí)行權(quán)轉(zhuǎn)到被調(diào)用函數(shù)中,然后再返回到調(diào)用它的函數(shù)中;而內(nèi)聯(lián)函數(shù)在調(diào)用時(shí),是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來(lái)替換。在使用內(nèi)聯(lián)函數(shù)時(shí),應(yīng)注意如下幾點(diǎn): 1.在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句。 如果內(nèi)聯(lián)函數(shù)有這些語(yǔ)句,則編譯將該函數(shù)視同普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼,遞歸函數(shù)(自己調(diào)用自己的函數(shù))

5、是不能被用來(lái)做內(nèi)聯(lián)函數(shù)的。內(nèi)聯(lián)函數(shù)只適合于只有15行的小函數(shù)。對(duì)一個(gè)含有許多語(yǔ)句的大函數(shù),函數(shù)調(diào)用和返回的開(kāi)銷(xiāo)相對(duì)來(lái)說(shuō)微不足道,所以也沒(méi)有必要用內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)。 2.內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。 3.本欄目講到的類(lèi)結(jié)構(gòu)中所有在類(lèi)說(shuō)明內(nèi)部定義的函數(shù)是內(nèi)聯(lián)函數(shù)。 虛函數(shù):定義虛函數(shù)必須是基類(lèi)的非靜態(tài)成員函數(shù),其訪(fǎng)問(wèn)權(quán)限可以是protected或public,在基類(lèi)的類(lèi)定義中定義虛函數(shù)的一般形式: virtual 函數(shù)返回值類(lèi)型 虛函數(shù)名(形參表) 函數(shù)體 作用虛函數(shù)的作用是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,也就是在程序的運(yùn)行階段動(dòng)態(tài)地選擇合適的成員函數(shù),在定義了虛函數(shù)后,可以在基類(lèi)的派生類(lèi)中對(duì)虛函

6、數(shù)重新定義,在派生類(lèi)中重新定義的函數(shù)應(yīng)與虛函數(shù)具有相同的形參個(gè)數(shù)和形參類(lèi)型。以實(shí)現(xiàn)統(tǒng)一的接口,不同定義過(guò)程。如果在派生類(lèi)中沒(méi)有對(duì)虛函數(shù)重新定義,則它繼承其基類(lèi)的虛函數(shù)。 當(dāng)程序發(fā)現(xiàn)虛函數(shù)名前的關(guān)鍵字virtual后,會(huì)自動(dòng)將其作為動(dòng)態(tài)聯(lián)編處理,即在程序運(yùn)行時(shí)動(dòng)態(tài)地選擇合適的成員函數(shù)。 動(dòng)態(tài)聯(lián)編規(guī)定,只能通過(guò)指向基類(lèi)的指針或基類(lèi)對(duì)象的引用來(lái)調(diào)用虛函數(shù),其格式: 指向基類(lèi)的指針變量名->虛函數(shù)名(實(shí)參表) 或 基類(lèi)對(duì)象的引用名. 虛函數(shù)名(實(shí)參表) 虛函數(shù)是C+多態(tài)的一種表現(xiàn) 例如:子類(lèi)繼承了父類(lèi)的一個(gè)函數(shù)(方法),而我們把父類(lèi)的指針指向子類(lèi),則必須把父類(lèi)的該函數(shù)(方法)設(shè)為virtual(

7、虛函數(shù))。 使用虛函數(shù),我們可以靈活的進(jìn)行動(dòng)態(tài)綁定,當(dāng)然是以一定的開(kāi)銷(xiāo)為代價(jià)。 如果父類(lèi)的函數(shù)(方法)根本沒(méi)有必要或者無(wú)法實(shí)現(xiàn),完全要依賴(lài)子類(lèi)去實(shí)現(xiàn)的話(huà),可以把此函數(shù)(方法)設(shè)為virtual 函數(shù)名=0 我們把這樣的函數(shù)(方法)稱(chēng)為純虛函數(shù)。 如果一個(gè)類(lèi)包含了純虛函數(shù),稱(chēng)此類(lèi)為抽象類(lèi) 。 示例虛函數(shù)的實(shí)例#include<iostream.h> class Cshape public: void SetColor( int color) m_nColor=color; void virtual Display( void) cout<<"Cshape&quo

8、t;<<endl; private: int m_nColor; ; class Crectangle: public Cshape public: void virtual Display( void) cout<<"Crectangle"<<endl; ; class Ctriangle: public Cshape void virtual Display( void) cout<<"Ctriangle"<<endl; ; class Cellipse :public Cshape pub

9、lic: void virtual Display(void) cout<<"Cellipse"<<endl; ; void main() Cshape obShape; Cellipse obEllipse; Ctriangle obTriangle; Crectangle obRectangle; Cshape * pShape4= &obShape, &obEllipse,&obTriangle, & obRectangle ; for( int I= 0; I< 4; I+) pShapeI->Di

10、splay( ); 本程序運(yùn)行結(jié)果: Cshape Cellipse Ctriangle Crectangle 條件所以,從以上程序分析,實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編需要三個(gè)條件: 1、 必須把動(dòng)態(tài)聯(lián)編的行為定義為類(lèi)的虛函數(shù)。 2、 類(lèi)之間存在子類(lèi)型關(guān)系,一般表現(xiàn)為一個(gè)類(lèi)從另一個(gè)類(lèi)公有派生而來(lái)。 3、 必須先使用基類(lèi)指針指向子類(lèi)型的對(duì)象,然后直接或者間接使用基類(lèi)指針調(diào)用虛函數(shù)。 其他信息定義虛函數(shù)的限制: (1)非類(lèi)的成員函數(shù)不能定義為虛函數(shù),類(lèi)的成員函數(shù)中靜態(tài)成員函數(shù)和構(gòu)造函數(shù)也不能定義為虛函數(shù),但可以將析構(gòu)函數(shù)定義為虛函數(shù)。實(shí)際上,優(yōu)秀的程序員常常把基類(lèi)的析構(gòu)函數(shù)定義為虛函數(shù)。因?yàn)椋瑢⒒?lèi)的析構(gòu)函數(shù)定義為

11、虛函數(shù)后,當(dāng)利用delete刪除一個(gè)指向派生類(lèi)定義的對(duì)象指針時(shí),系統(tǒng)會(huì)調(diào)用相應(yīng)的類(lèi)的析構(gòu)函數(shù)。而不將析構(gòu)函數(shù)定義為虛函數(shù)時(shí),只調(diào)用基類(lèi)的析構(gòu)函數(shù)。 (2)只需要在聲明函數(shù)的類(lèi)體中使用關(guān)鍵字“virtual”將函數(shù)聲明為虛函數(shù),而定義函數(shù)時(shí)不需要使用關(guān)鍵字“virtual”。 (3)當(dāng)將基類(lèi)中的某一成員函數(shù)聲明為虛函數(shù)后,派生類(lèi)中的同名函數(shù)自動(dòng)成為虛函數(shù)。 (4)如果聲明了某個(gè)成員函數(shù)為虛函數(shù),則在該類(lèi)中不能出現(xiàn)和這個(gè)成員函數(shù)同名并且返回值、參數(shù)個(gè)數(shù)、類(lèi)型都相同的非虛函數(shù)。在以該類(lèi)為基類(lèi)的派生類(lèi)中,也不能出現(xiàn)這種同名函數(shù)。      虛函數(shù)聯(lián)系到多態(tài),多態(tài)

12、聯(lián)系到繼承。所以本文中都是在繼承層次上做文章。沒(méi)了繼承,什么都沒(méi)得談。 c+的虛函數(shù)下面是對(duì)C+的虛函數(shù)這玩意兒的理解。 一, 什么是虛函數(shù)(如果不知道虛函數(shù)為何物,但又急切的想知道,那你就應(yīng)該從這里開(kāi)始) 簡(jiǎn)單地說(shuō),那些被virtual關(guān)鍵字修飾的成員函數(shù),就是虛函數(shù)。虛函數(shù)的作用,用專(zhuān)業(yè)術(shù)語(yǔ)來(lái)解釋就是實(shí)現(xiàn)多態(tài)性(Polymorphism),多態(tài)性是將接口與實(shí)現(xiàn)進(jìn)行分離;用形象的語(yǔ)言來(lái)解釋就是實(shí)現(xiàn)以共同的方法,但因個(gè)體差異而采用不同的策略。下面來(lái)看一段簡(jiǎn)單的代碼 class A public: void print() cout<<”This is A”<<endl;

13、 ; class B:public A public: void print() cout<<”This is B”<<endl; ; int main() /為了在以后便于區(qū)分,我這段main()代碼叫做main1 A a; B b; a.print(); b.print(); 通過(guò)class A和class B的print()這個(gè)接口,可以看出這兩個(gè)class因個(gè)體的差異而采用了不同的策略,輸出的結(jié)果也是我們預(yù)料中的,分別是This is A和This is B。但這是否真正做到了多態(tài)性呢?No,多態(tài)還有個(gè)關(guān)鍵之處就是一切用指向基類(lèi)的指針或引用來(lái)操作對(duì)象。那現(xiàn)在就把

14、main()處的代碼改一改。 int main() /main2 A a; B b; A* p1=&a; A* p2=&b; p1->print(); p2->print(); 運(yùn)行一下看看結(jié)果,喲呵,驀然回首,結(jié)果卻是兩個(gè)This is A。問(wèn)題來(lái)了,p2明明指向的是class B的對(duì)象但卻是調(diào)用的class A的print()函數(shù),這不是我們所期望的結(jié)果,那么解決這個(gè)問(wèn)題就需要用到虛函數(shù) class A public: virtual void print() cout<<”This is A”<<endl; /現(xiàn)在成了虛函數(shù)了 ; cl

15、ass B:public A public: void print() cout<<”This is B”<<endl; /這里需要在前面加上關(guān)鍵字virtual嗎? ; 毫無(wú)疑問(wèn),class A的成員函數(shù)print()已經(jīng)成了虛函數(shù),那么class B的print()成了虛函數(shù)了嗎?回答是Yes,我們只需在把基類(lèi)的成員函數(shù)設(shè)為virtual,其派生類(lèi)的相應(yīng)的函數(shù)也會(huì)自動(dòng)變?yōu)樘摵瘮?shù)。所以,class B的print()也成了虛函數(shù)。那么對(duì)于在派生類(lèi)的相應(yīng)函數(shù)前是否需要用virtual關(guān)鍵字修飾,那就是你自己的問(wèn)題了。 現(xiàn)在重新運(yùn)行main2的代碼,這樣輸出的結(jié)果就是Th

16、is is A和This is B了。 現(xiàn)在來(lái)消化一下,我作個(gè)簡(jiǎn)單的總結(jié),指向基類(lèi)的指針在操作它的多態(tài)類(lèi)對(duì)象時(shí),會(huì)根據(jù)不同的類(lèi)對(duì)象,調(diào)用其相應(yīng)的函數(shù),這個(gè)函數(shù)就是虛函數(shù)。 二, 虛函數(shù)是如何做到的(如果你沒(méi)有看過(guò)Inside The C+ Object Model這本書(shū),但又急切想知道,那你就應(yīng)該從這里開(kāi)始) 虛函數(shù)是如何做到因?qū)ο蟮牟煌{(diào)用其相應(yīng)的函數(shù)的呢?現(xiàn)在我們就來(lái)剖析虛函數(shù)。我們先定義兩個(gè)類(lèi) class A /虛函數(shù)示例代碼 public: virtual void fun()cout<<1<<endl; virtual void fun2()cout<

17、<2<<endl; ; class B:public A public: void fun()cout<<3<<endl; void fun2()cout<<4<<endl; ; 由于這兩個(gè)類(lèi)中有虛函數(shù)存在,所以編譯器就會(huì)為他們兩個(gè)分別插入一段你不知道的數(shù)據(jù),并為他們分別創(chuàng)建一個(gè)表。那段數(shù)據(jù)叫做vptr指針,指向那個(gè)表。那個(gè)表叫做vtbl,每個(gè)類(lèi)都有自己的vtbl,vtbl的作用就是保存自己類(lèi)中虛函數(shù)的地址,我們可以把vtbl形象地看成一個(gè)數(shù)組,這個(gè)數(shù)組的每個(gè)元素存放的就是虛函數(shù)的地址,請(qǐng)看圖    

18、0; 通過(guò)左圖,可以看到這兩個(gè)vtbl分別為class A和class B服務(wù)?,F(xiàn)在有了這個(gè)模型之后,我們來(lái)分析下面的代碼 A *p=new A; p->fun(); 毫無(wú)疑問(wèn),調(diào)用了A:fun(),但是A:fun()是如何被調(diào)用的呢?它像普通函數(shù)那樣直接跳轉(zhuǎn)到函數(shù)的代碼處嗎?No,其實(shí)是這樣的,首先是取出vptr的值,這個(gè)值就是vtbl的地址,再根據(jù)這個(gè)值來(lái)到vtbl這里,由于調(diào)用的函數(shù)A:fun()是第一個(gè)虛函數(shù),所以取出vtbl第一個(gè)slot里的值,這個(gè)值就是A:fun()的地址了,最后調(diào)用這個(gè)函數(shù)?,F(xiàn)在我們可以看出來(lái)了,只要vptr不同,指向的vtbl就不同,而不同的v

19、tbl里裝著對(duì)應(yīng)類(lèi)的虛函數(shù)地址,所以這樣虛函數(shù)就可以完成它的任務(wù)。 而對(duì)于class A和class B來(lái)說(shuō),他們的vptr指針存放在何處呢?其實(shí)這個(gè)指針就放在他們各自的實(shí)例對(duì)象里。由于class A和class B都沒(méi)有數(shù)據(jù)成員,所以他們的實(shí)例對(duì)象里就只有一個(gè)vptr指針。通過(guò)上面的分析,現(xiàn)在我們來(lái)實(shí)作一段代碼,來(lái)描述這個(gè)帶有虛函數(shù)的類(lèi)的簡(jiǎn)單模型。 #include<iostream> using namespace std; /將上面“虛函數(shù)示例代碼”添加在這里 int main() void (*fun)(A*); A *p=new B; long lVptrAddr; me

20、mcpy(&lVptrAddr,p,4); memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4); fun(p); delete p; system("pause"); 用VC或Dev-C+編譯運(yùn)行一下,看看結(jié)果是不是輸出3,如果不是,那么太陽(yáng)明天肯定是從西邊出來(lái)?,F(xiàn)在一步一步開(kāi)始分析 void (*fun)(A*); 這段定義了一個(gè)函數(shù)指針名字叫做fun,而且有一個(gè)A*類(lèi)型的參數(shù),這個(gè)函數(shù)指針待會(huì)兒用來(lái)保存從vtbl里取出的函數(shù)地址 A* p=new B; new B是向內(nèi)存(內(nèi)存分5個(gè)區(qū):全局名字

21、空間,自由存儲(chǔ)區(qū),寄存器,代碼空間,棧)自由存儲(chǔ)區(qū)申請(qǐng)一個(gè)內(nèi)存單元的地址然后隱式地保存在一個(gè)指針中.然后把這個(gè)地址附值給A類(lèi)型的指針P. . long lVptrAddr; 這個(gè)long類(lèi)型的變量待會(huì)兒用來(lái)保存vptr的值 memcpy(&lVptrAddr,p,4); 前面說(shuō)了,他們的實(shí)例對(duì)象里只有vptr指針,所以我們就放心大膽地把p所指的4bytes內(nèi)存里的東西復(fù)制到lVptrAddr中,所以復(fù)制出來(lái)的4bytes內(nèi)容就是vptr的值,即vtbl的地址 現(xiàn)在有了vtbl的地址了,那么我們現(xiàn)在就取出vtbl第一個(gè)slot里的內(nèi)容 memcpy(&fun,reinterpre

22、t_cast<long*>(lVptrAddr),4); 取出vtbl第一個(gè)slot里的內(nèi)容,并存放在函數(shù)指針fun里。需要注意的是lVptrAddr里面是vtbl的地址,但lVptrAddr不是指針,所以我們要把它先轉(zhuǎn)變成指針類(lèi)型 fun(p); 這里就調(diào)用了剛才取出的函數(shù)地址里的函數(shù),也就是調(diào)用了B:fun()這個(gè)函數(shù),也許你發(fā)現(xiàn)了為什么會(huì)有參數(shù)p,其實(shí)類(lèi)成員函數(shù)調(diào)用時(shí),會(huì)有個(gè)this指針,這個(gè)p就是那個(gè)this指針,只是在一般的調(diào)用中編譯器自動(dòng)幫你處理了而已,而在這里則需要自己處理。 delete p; 釋放由p指向的自由空間; system("pause"

23、;); 屏幕暫停; 如果調(diào)用B:fun2()怎么辦?那就取出vtbl的第二個(gè)slot里的值就行了 memcpy(&fun,reinterpret_cast<long*>(lVptrAddr+4),4); 為什么是加4呢?因?yàn)橐粋€(gè)指針的長(zhǎng)度是4bytes,所以加4。或者memcpy(&fun,reinterpret_cast<long*>(lVptrAddr)+1,4); 這更符合數(shù)組的用法,因?yàn)閘VptrAddr被轉(zhuǎn)成了long*型別,所以+1就是往后移sizeof(long)的長(zhǎng)度 三, 以一段代碼開(kāi)始#include<iostream>

24、using namespace std; class A /虛函數(shù)示例代碼2 public: virtual void fun() cout<<"A:fun"<<endl; virtual void fun2()cout<<"A:fun2"<<endl; ; class B:public A public: void fun() cout<<"B:fun"<<endl; void fun2() cout<<"B:fun2"<&

25、lt;endl; ; /end/虛函數(shù)示例代碼2 int main() void (A:*fun)(); /定義一個(gè)函數(shù)指針 A *p=new B; fun=&A:fun; (p->*fun)(); fun = &A:fun2; (p->*fun)(); delete p; system("pause"); 你能估算出輸出結(jié)果嗎?如果你估算出的結(jié)果是A:fun和A:fun2,呵呵,恭喜恭喜,你中圈套了。其實(shí)真正的結(jié)果是B:fun和B:fun2,如果你想不通就接著往下看。給個(gè)提示,&A:fun和&A:fun2是真正獲得了虛函數(shù)的地址嗎? 首先我們回到第二部分,通過(guò)段實(shí)作代碼,得到一個(gè)“通用”的獲得虛函數(shù)地址的方法 #include<iostream> using namespace std; /將上面“虛函數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論