第12章 構(gòu)造函數(shù)_第1頁
第12章 構(gòu)造函數(shù)_第2頁
第12章 構(gòu)造函數(shù)_第3頁
第12章 構(gòu)造函數(shù)_第4頁
第12章 構(gòu)造函數(shù)_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第12章 構(gòu)造函數(shù)2本章主要內(nèi)容o12.1 類與對象o12.2 構(gòu)造函數(shù)的需要性o12.3 構(gòu)造函數(shù)的使用o12.4 析構(gòu)函數(shù)o12.5 帶參數(shù)的構(gòu)造函數(shù)o12.6 重載構(gòu)造函數(shù)o12.7 默認構(gòu)造函數(shù)o12.8 類成員初始化的困惑o12.9 構(gòu)造類成員o12.10 構(gòu)造對象的順序o作業(yè)312.1 類與對象1. 類與對象的區(qū)別o類:抽象的,描述一類事物應具有的屬性和操作。o對象:具體的,是類的一個具體的實例,具有確定的屬性和操作。o對象可以被創(chuàng)建和銷毀,但類是無所不在的。2.對象的定義o定義對象應為對象分配內(nèi)存空間。o在11.4節(jié)中已介紹412.1 類與對象3.對象的初始化o初始化要求:對象的

2、定義表達了現(xiàn)實世界的實初始化要求:對象的定義表達了現(xiàn)實世界的實體體, ,因此因此, ,一旦建立一個類的對象一旦建立一個類的對象, ,需要一個有意需要一個有意義的初始值義的初始值。所以類的對象創(chuàng)建的時候必須被。所以類的對象創(chuàng)建的時候必須被初始化。初始化。Student t; /全局對象全局對象int main() Student s; /局部對象局部對象 /說明:說明:全局對象全局對象, ,靜態(tài)對象以全靜態(tài)對象以全0 0位的模式表示,位的模式表示, 局部對象以隨機值表示。局部對象以隨機值表示。512.2 構(gòu)造函數(shù)的需要性o變量初始化的方法如下: int a=1; int * pa=&a;

3、o數(shù)組初始化的方法如下: int b =1,2,3,4;o結(jié)構(gòu)初始化的方法如下: struct Student int somesHours; /總需學時數(shù) float gpa; /平均成績 ; void fn( ) Student s=100, 3.5; /創(chuàng)建結(jié)構(gòu)變量時初始化 / 612.2 構(gòu)造函數(shù)的需要性o封裝性要求:封裝性要求:初始化不是簡單的參數(shù)與成員對應初始化不是簡單的參數(shù)與成員對應, ,而是而是聯(lián)系參數(shù)到成員的過程聯(lián)系參數(shù)到成員的過程. .class Student protected: int somesHours; /總需學時數(shù) float gpa; /平均成績 ; voi

4、d fn( ) Student s=100, 3.5; /error,不能訪問;/因為類的封裝性, 相當于可以訪問類的保護成員 / ;o說明:類對象不能使用和結(jié)構(gòu)類似的初始化方式;應該通過成員函數(shù)初始化。712.2 構(gòu)造函數(shù)的需要性o普通的成員函數(shù)初始化對象class Student public: void init()somesHours=100; gpa=3.5; protected: int somesHours; /總需學時數(shù) float gpa; /平均成績 ; void fn( ) Student s; s.init(); /增加書寫代碼,且不能真正實現(xiàn)初始化 ;o說明:應該通過

5、特殊的成員函數(shù)初始化對象,即構(gòu)造函數(shù)。8o構(gòu)造函數(shù):在類定義中,與類同名且沒有返回類型的成員函數(shù)。o作用:在創(chuàng)建對象時,由系統(tǒng)自動調(diào)用,對對象進行初始化 。12.3 構(gòu)造函數(shù)的使用9o1.構(gòu)造函數(shù)創(chuàng)建構(gòu)造函數(shù)創(chuàng)建 class Pointdouble x , y ;public:Point(double ix , double iy) /構(gòu)造函數(shù)構(gòu)造函數(shù) x=ix; y=iy; double xOffset();double yOffset();double angle();double radius(); 12.3 構(gòu)造函數(shù)的使用10int main( )Point p1(3,4); 自動調(diào)用

6、構(gòu)造函數(shù)自動調(diào)用構(gòu)造函數(shù)Point(double ix , double iy); 12.3 構(gòu)造函數(shù)的使用11o構(gòu)造函數(shù)可以放在類的外部定義,加“類名:”。o例:/ch12_1.cpp #include class Desk public: Desk( ); /構(gòu)造函數(shù)聲明 protected: int weight; int high; int width; int length; ;12.3 構(gòu)造函數(shù)的使用class Stool public: Stool( ); /構(gòu)造函數(shù)聲明 protected: int weight; int high; int width; int length

7、; ;12Desk:Desk( ) /構(gòu)造函數(shù)定義 weight=10; high=5; width=5; length=5; cout weight high width length endl; Page 12Stool:Stool( ) /構(gòu)造函數(shù)定義 weight=6; high=3; width=3; length=3; cout weight high width length endl; 12.3 構(gòu)造函數(shù)的使用13 void fn( ) Desk da; /自動調(diào)用Desk( ) Stool sa; /自動調(diào)用Stool( ) int main( ) fn( ); 主函數(shù)運行時

8、調(diào)用主函數(shù)運行時調(diào)用fn( ), fn( )fn( ), fn( )在創(chuàng)建在創(chuàng)建DeskDesk對象對象dada和和StoolStool對象對象sasa時,分別調(diào)用了兩者的構(gòu)造函數(shù)。時,分別調(diào)用了兩者的構(gòu)造函數(shù)。12.3 構(gòu)造函數(shù)的使用運行結(jié)果:運行結(jié)果:10 5 5 56 3 3 314o如果在上例中的函數(shù)如果在上例中的函數(shù)fn( )中,定義桌子對象的語中,定義桌子對象的語句改成定義句改成定義對象數(shù)組對象數(shù)組:Page 14void fn( ) Desk dd 5 ; /對象數(shù)組dd Stool sa ; 則定義則定義對象數(shù)組對象數(shù)組的語句中構(gòu)造函數(shù)會被調(diào)用的語句中構(gòu)造函數(shù)會被調(diào)用5次。次。

9、12.3 構(gòu)造函數(shù)的使用運行結(jié)果:運行結(jié)果:10 5 5 510 5 5 510 5 5 510 5 5 510 5 5 56 3 3 315o2.構(gòu)造函數(shù)的特點o構(gòu)造函數(shù)與類同名,沒有返回類型,函數(shù)體中不允許返回值,但可以有無值返回語句 “return;”;由系統(tǒng)自動調(diào)用。o例: void Desk:Desk( ) /error:構(gòu)造函數(shù)定義class Pointdouble x , y ;public:Point(double ix , double iy) if(ix0 | iy0) cout“illegle date!n”; return; /. ;Page 1512.3 構(gòu)造函數(shù)的使

10、用16o3.對象成員的構(gòu)造o一個類定義中 ,類的數(shù)據(jù)成員可能為另一個類的對象, 此時在類的對象創(chuàng)建所調(diào)用的構(gòu)造函數(shù)中,對該成員(對象)自動調(diào)用其構(gòu)造函數(shù)。o例: /ch12_2.cppo #include o class Studento public:o Student( ) o cout constructing student.n;o semesHours=100;o gpa=3.5;o o /其他公共成員 o protected:o int semesHours;o float gpa;1. ;l class Teacherl public:l Teacher( ) l cout co

11、nstructing teacher.n;l l ; 12.3 構(gòu)造函數(shù)的使用17oclass TutorPairo public:o TutorPair( ) o cout constructing tutorpair.n;o noMeetings=0;o o protected:o Student student;o Teacher teacher;o int noMeetings; /會晤次數(shù)o;oint main( ) o TutorPair tp;o cout back in main.n;o 運行結(jié)果為:運行結(jié)果為:constructing student.constructing

12、 teacher.constructing tutorpair.back in main.12.3 構(gòu)造函數(shù)的使用1812.4 析構(gòu)函數(shù)o 對象結(jié)束其生命時,會被系統(tǒng)悄悄地銷毀(析構(gòu)),即對象本體空間與名字脫離關(guān)系。o析構(gòu)函數(shù):在類定義中,與類同名、并在前面冠以“”的成員函數(shù) 。o特點:是特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào)用,系統(tǒng)自動調(diào)用,也沒有重載。o作用:釋放對象在構(gòu)造中分配的資源(例如:關(guān)閉被構(gòu)造函數(shù)打開的文件,釋放動態(tài)內(nèi)存)。在對象生命期結(jié)束時,由系統(tǒng)自動調(diào)用,并且以與構(gòu)造函數(shù)相反的調(diào)用順序被調(diào)用。19o#include oclass Studento public

13、:o Student( )o cout constructing student.n;o semesHours=100;o gpa=3.5;o o Student( )o cout destructing student.n;o /其他公共成員 protected: int semesHours; float gpa; ; class Teacher public: Teacher( ) cout constructing teacher.n; Teacher( ) cout destructing teacher.n; ;/ch12_3.cpp20oclass TutorPairo publ

14、ic:o TutorPair( )o cout constructing tutorpair.n;o noMeetings=0;o o TutorPair( )o cout destructing tutorpair.n;o protected:o Student student;o Teacher teacher;o int noMeetings;o;o int main( )o o TutorPair tp;o cout back in main.n;o 運行結(jié)果:運行結(jié)果: constructing student. constructing teacher. constructing

15、tutorpair. back in main. destructing tutorpair. destructing teacher. destructing student. 注意:構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序正好相反。2112.5 帶參數(shù)的構(gòu)造函數(shù)o不帶參數(shù)的構(gòu)造函數(shù)對數(shù)據(jù)成員的初始化,取決于構(gòu)造函數(shù)體中對哪些數(shù)據(jù)成員進行賦初值,且用此構(gòu)造函數(shù)構(gòu)造的所有對象的初始值都相同。 o帶參數(shù)的構(gòu)造函數(shù)可以使得各對象的數(shù)據(jù)成員的初始值不同,通過創(chuàng)建對象時將實參傳遞給構(gòu)造函數(shù),達到初始化目的。Page 2122/ch12_4.cppo# includeo# includeoclass Student

16、o public:o Student(char* pName)o cout constructing student pName endl; o strncpy(name,pName,sizeof(name); /字符串復制o namesizeof(name)-1=0;o o Student( )o cout destructing name endl;o /其他公共成員12.5 帶參數(shù)的構(gòu)造函數(shù)23o構(gòu)造函數(shù)可以有任意多個參數(shù)。/ch12_5.cpp o # include o # include o class Studento public:o Student(char* pName,

17、int xHours, float xgpa) o cout constructing student pName endl;o strncpy(name,pName,sizeof(name);o namesizeof(name)-1=0;o semesHours=xHours;o gpa=xgpa;o o Student( )o cout destructing name endl;o o /其他公共成員o protected:o char name20;o int semesHours;o float gpa;o ; o int main( )o Student ss(Jenny, 22,

18、 3.5);o 運行結(jié)果為:運行結(jié)果為:constructing student Jennydestructing Jenny2412.6 重載構(gòu)造函數(shù)o重載構(gòu)造函數(shù):在一個類中出現(xiàn)多個構(gòu)造函數(shù),但是它們所帶的參數(shù)個數(shù)、參數(shù)類型,或次序有所不同 。/ch12_6.cppo # include o class Tdateo public:o Tdate( ); /默認構(gòu)造函數(shù)o Tdate(int d);o Tdate(int m, int d);o Tdate(int m, int d, int y);o /其他公共成員o protected:o int month;o int day;o i

19、nt year;1. ;Page 2425oTdate:Tdate( ) o month=4; day=15; year=1995;o cout month / day /year endl;ooTdate:Tdate(int d)o month=4; day=d; year=1996;o cout month / day/ year endl;ooTdate:Tdate(int m, int d)o month=m; day=d; year=1997;o cout month / day/ year endl;o oTdate:Tdate(int m,int d, int y)o month

20、=m; day=d; year=y;o cout month / day/ year endl;o12.6 重載構(gòu)造函數(shù) int main( ) Tdate aday; Tdate bday(10); Tdate cday(2, 12); Tdate dday(1, 2, 1998); 運行結(jié)果:運行結(jié)果:4/15/19954/10/1996 2/12/19971/2/199826o多個構(gòu)造函數(shù)可以共享初始化過程,先定義一個共享成員函數(shù),然后每個構(gòu)造函數(shù)都調(diào)用之。/ch12_7.cppo# include oclass Tdateo public:o Tdate( ) Init(4,15,19

21、95); o Tdate(int d) Init(4,d,1996); o Tdate(int m,int d) Init(m,d,1997); o Tdate(int m,int d,int y) Init(m,d,y); o /其他公共成員o protected:o int month;o int day;o int year;o void Init(int m,int d,int y)o month=m; day=d; year=y;o cout month / day / year endl;o o ; Page 2612.6 重載構(gòu)造函數(shù)27n int main( )n Tdate

22、aday;n Tdate bday(10);n Tdate cday(2, 12);n Tdate dday(1, 2, 1998);n 運行結(jié)果:4/15/1995 4/10/1996 2/12/1997 1/2/1998Page 2712.6 重載構(gòu)造函數(shù)28o多個構(gòu)造函數(shù)可以通過給一個構(gòu)造函數(shù)以參數(shù)默認值,使多個構(gòu)造函數(shù)結(jié)合成一個。/ch12_8.cpp o# include o class Tdateo public:o Tdate(int m=4, int d=15, int y=1995)o month=m; day=d; year=y;o cout month / day/ ye

23、ar endl;o o /其他公共成員o protected:o int month;o int day;o int year;o ;Page 28l int main( )l Tdate aday;l Tdate bday(2);l Tdate cday(3, 12);l Tdate dday(1, 2, 1998);l 運行結(jié)果同上例12.6 重載構(gòu)造函數(shù)29o重載構(gòu)造函數(shù)若與參數(shù)默認值的構(gòu)造函數(shù)發(fā)生沖突,則創(chuàng)建對象的語句會導致編譯錯誤。o例:class Tdate public: Tdate(int d) month=4; day=d; year=1998; Tdate(int m, i

24、nt d=12) month=m; day=d; year=1997; /其他公共成員 protected: int month; int day; int year; ; int main( ) Tdate aday(11);/error:匹配哪個構(gòu)造函數(shù)? 12.6 重載構(gòu)造函數(shù)3012.7 默認構(gòu)造函數(shù)oC+規(guī)定,每個類必須有一個構(gòu)造函數(shù),沒有就不能創(chuàng)建任何對象。o若未提供一個類的構(gòu)造函數(shù),則C+提供一個默認的構(gòu)造函數(shù),它是個無參構(gòu)造函數(shù),僅負責創(chuàng)建對象,而不做任何初始化工作。o只要一個類定義了一個構(gòu)造函數(shù),C+就不再提供默認的默認構(gòu)造函數(shù)。o與變量定義類似,在用默認構(gòu)造函數(shù)創(chuàng)建對象時,

25、如果創(chuàng)建的是全局對象或靜態(tài)對象,則對象的位模式全為0,否則, 對象值是隨機的。31 例: class Student /無構(gòu)造函數(shù) protected: char name20; ; int main( ) Student noName; /ok:noName的內(nèi)容 / 為隨機值 public: Student( ) /一個空的無一個空的無 /參構(gòu)造函數(shù)參構(gòu)造函數(shù)等價于12.7 默認構(gòu)造函數(shù)32o又例如,下面的代碼定義了一個帶參數(shù)的構(gòu)造函數(shù),面對創(chuàng)建無參對象,將不能正確的編譯: o #include o class Studento public:o Student(char* pName)o

26、 strncpy(name,pName,sizeof(name);o namesizeof(name)-1=0;o o protected:o char name20;o ;o int main( )o o Student noName; /error:無匹配的構(gòu)造函數(shù) o 12.7 默認構(gòu)造函數(shù)33o如果增加一個無參的構(gòu)造函數(shù),就可解決這個問題:o #include o class Studento public:o Student(char* pName)o strncpy(name,pName,sizeof(name);o namesizeof(name)-1=0;o o Student

27、( ) o protected:o char name20;o ;o int main( )o o Student noName; /oko Student ss(Jenny); /ok1. 12.7 默認構(gòu)造函數(shù)34o說明的含糊性o先前的例子中創(chuàng)建Tdate類對象的方法是: Tdate aday; /為什么創(chuàng)建無參的對象無括號? Tdate bday(2); /對象的參數(shù)放在括號中 Tdate aday( ) ; /為什么不能這樣聲明?o根據(jù)C+的語法規(guī)定,這樣是聲明了一個名叫aday的普通函數(shù),他返回Tdate類對象,并且沒有參數(shù)。 又例如下面的代碼,一個是創(chuàng)建對象,一個是聲明函數(shù): Td

28、ate oneday(10); /創(chuàng)建對象 Tdate oneday(int); /聲明函數(shù)12.7 默認構(gòu)造函數(shù)35o當一個類中的某個成員是另一個類的對象時,如何初始化這個成員?/ch12_10.cpp o # include o # include o int nextStudentID=0;o class StudentIDo public: o StudentID( )o value=+nextStudentID;o cout Assigning student id value endl;o o StudentID( )o -nextStudentID;o cout Destruct

29、ing id value endl;o o protected:o int value;o ; 36nclass Studentn public:n Student(char* pName=noName)n cout Constructing student pName n endl;o strcpy(name,pName);o namesizeof(name)-1=0; o o protected:o char name20;o StudentID id;o ; o int main( )o Student s(Randy);o Page 36運行結(jié)果:運行結(jié)果:Assigning stud

30、ent id 1Constructing student RandyDestructing id 137o如果想調(diào)用的函數(shù)不是默認構(gòu)造函數(shù)又如何呢?o例如,下面的程序在創(chuàng)建學生對象時,賦予一個學號,希望將這個學號傳給成員學號類對象id保存:/ch12_11.cpp o # include o # include o class StudentIDo public:o StudentID(int id=0)o value=id;o cout Assigning student id value endl;o o StudentID( )o cout Destructing id value en

31、dl;o o protected: o int value;o ;38oclass Studento public: o Student(char* pName=noName,int ssID=0) o cout Constructing studentpName endl;o strcpy(name,pName);o namesizeof(name)-1=0;o StudentID id(ssID);/實際上創(chuàng)建了一個局部對象ido o protected:o char name20;o StudentID id; o ; oint main( )o Student s(Randy,9818

32、);o 運行結(jié)果為:Assigning student id 0Constructing student RandyAssigning student id 9818Destructing id 9818Destructing id 0o此結(jié)果并未達到在初始化時賦予的學號傳給學號類對象id的目的。39o那么,能否像下面這樣在Student類中直接給id對象初始化呢?class Student public: Student(char *pname=“noName”, int ssID); protected: char name20; StudentID id(9818); /error /類

33、定義是不分配空間和初始化的;o 類是一個抽象概念,并不是一個實體,并不含有屬性值,而只有對象才占有一定的空間, 含有明確的屬性值。40o 類成員的構(gòu)造應該在建立對象空間的結(jié)構(gòu)時反映出來,即需要出現(xiàn)在函數(shù)調(diào)用剛剛轉(zhuǎn)入之時,函數(shù)體執(zhí)行(開括號)之前。o 類成員的初始化完全可以利用構(gòu)造函數(shù)完成,在構(gòu)造函數(shù)的原型中利用冒號語法,在冒號后面進行成員初始化: 構(gòu)造函數(shù)(參數(shù)列表):成員初始化列表 例:例: /ch12_12.cpp41 /ch12_12.cppo # include o # include o oclass StudentIDo public:o StudentID(int id=0)o

34、value=id;o cout Assigning student id value endl;o o StudentID( )o cout Destructing id value endl;o o protected:o int value;o ;42oclass Studento public:o Student(char* pName=no name, int ssID=0) :id(ssID)o /冒號表示后面要對類的數(shù)據(jù)成員的構(gòu)造函數(shù)進行調(diào)用。o /這里是調(diào)用以ssID為實參的StudentID構(gòu)造函數(shù)。o cout Constructing student pName endl;

35、o strncpy(name,pName,sizeof(name);o namesizeof(name)-1=0;o o protected:o char name20;o StudentID id; o ;o int main( )o Student s(Randy,9818);o Student t(Jenny);o 運行結(jié)果:運行結(jié)果: Assigning student id 9818 Constructing student Randy Assigning student id 0 Constructing student Jenny Destructing id 0 Destruc

36、ting id 981843o 構(gòu)造函數(shù)頭后面如果是id( )的形式,表示調(diào)用StudentID的默認構(gòu)造函數(shù),并且可以省略。 Student(char* pName=no name, int ssID=0) :id( ) / 也可以寫成: Student(char* pName=no name, int ssID=0) / 44o 構(gòu)造類成員時調(diào)用類成員的哪個構(gòu)造函數(shù)要是看參數(shù)匹配的情況。o 例如,在ch12_12.cpp中,如果StudentID構(gòu)造函數(shù)中,參數(shù)沒有默認值,即原型為: StudentID(int id);表明StudentID沒有默認構(gòu)造函數(shù)。o 而如果Student構(gòu)造函

37、數(shù)的原型為: Student(char *pName=no name, int ssID) ;是無冒號形式,表明Student將調(diào)用StudentID的默認構(gòu)造函數(shù)。于是,主函數(shù)中的兩條創(chuàng)建Student對象的語句都要遇到不能匹配StudentID構(gòu)造函數(shù)的錯誤。 45p冒號語法使得常量數(shù)據(jù)成員和引用數(shù)據(jù)成員的初始化成為可能。 例:class SillyClass public: SillyClass(int & i):ten(10),refI(i) protected: const int ten; /常量數(shù)據(jù)成員 int & refI; /引用數(shù)據(jù)成員 ; int main

38、( ) int i; SillyClass sc(i); 46o常量是不能被賦值的,引用變量也是不可重新指派的,一旦初始化,其值就永不改變。例:class SillyClass public: SillyClass(int &i) ten=10; /error:常量是不能被賦值 refI=i; /error:引用不可重新指派 protected: const int ten; int & refI; ; 47o數(shù)據(jù)成員若是一般變量,則放在冒號后面與放在函數(shù)體中初始化一樣。 例:class SillyClass class SillyClass public: public: S

39、illyClass( ) SillyClass( ):d(10) /方法2 d=10;/方法1 protected: protected: int d; int d; ; ;48o說明一個變量并初始化有兩種形式: int main( ) int m=10; /ok int n(20); /TC+3.0不允許,C+新標準允許 Student s=“Jenny”; /ok Student t(“Danny”); /ok:類的形式不受限制 o注意:賦值表達式中不允許:m(10); 只能:m=10; 構(gòu)造函數(shù)的冒號后的初始化不允許用第一種形式: class SillyClass public: SillyClass2( ):d=10 /error protected: int d; ;491.局部和靜態(tài)對象,以聲明的順序構(gòu)造。o# include o# include oclass Studento public:o Student(char* pName=no name)o cout constructing student pName endl;o strncpy(name,pName,sizeof(name);o namesizeof(name)-1=0;o o Student( )o cout destructing

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論