面向對象編程技術與方法 課件 第4章 類與對象_第1頁
面向對象編程技術與方法 課件 第4章 類與對象_第2頁
面向對象編程技術與方法 課件 第4章 類與對象_第3頁
面向對象編程技術與方法 課件 第4章 類與對象_第4頁
面向對象編程技術與方法 課件 第4章 類與對象_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

面向對象編程技術與方法(C++)

第4章類與對象第4章類與對象第4章

類與對象

4.1類與對象的定義

4.1.1類的定義

4.1.2類對象

4.1.3類的封裝性和信息隱藏

4.2構造函數(shù)與析構函數(shù)

4.2.1構造函數(shù)

4.2.2析構函數(shù)

4.2.3構造與析構的順序

4.3賦值成員函數(shù)

4.4靜態(tài)成員

4.4.1靜態(tài)數(shù)據(jù)成員

4.4.2靜態(tài)成員函數(shù)

4.5常成員

4.5.1常數(shù)據(jù)成員

4.5.2常成員函數(shù)

4.5.3mutable 4.6指向成員的指針

4.6.1成員指針的定義與使用

4.6.2如何得到成員函數(shù)的地址

4.7組合類

4.8友元

4.8.1友元函數(shù)

4.8.2友元類

4.9小結

第4章類與對象4.1類與對象的定義

4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員 4.6指向成員的指針 4.7組合類 4.8友元 4.9小結

第4章類與對象4.1類與對象的定義4.1.1類的定義定義一個類,實際上就是定義一種新的數(shù)據(jù)類型。類把數(shù)據(jù)和操作封裝在一起,其中的數(shù)據(jù)成員和成員函數(shù)統(tǒng)稱為類的成員。在定義類時還要對類中的某些成員進行隱藏,因此類不僅具有封裝性,還具有信息隱藏性。class類名{public:公有的數(shù)據(jù)成員和成員函數(shù);protected:受保護的數(shù)據(jù)成員和成員函數(shù);private:私有的數(shù)據(jù)成員和成員函數(shù);};//此處的分號不能少!public、private以及protected是訪問屬性關鍵字,它們控制外界訪問類成員的權限。成員的默認訪問屬性為private。一般成員函數(shù)和本類的友元函數(shù)可以訪問本類的所有成員。公有成員為類與外界交互的接口,一般將成員函數(shù)聲明為類的公有成員。外界可以訪問類對象的公有成員。私有成員是類中被隱藏的部分,一般將數(shù)據(jù)成員定義為類的私有成員。外界不能訪問類的私有成員。受保護成員具有和私有成員相似的訪問屬性,但繼承的情況下,基類受保護成員在派生類中的訪問屬性與私有成員有所不同,將在第6章介紹。第4章類與對象classCPoint{public: intXcoord(){returnX;}//成員函數(shù)定義

intYcoord(){returnY;}//成員函數(shù)定義

voidSetPoint(intx,inty){X=x;Y=y;} voidMove(intdx,intdy){X+=dx;Y+=dy;}private: intX,Y;//數(shù)據(jù)成員};//此處分號不能少!第4章類與對象成員函數(shù)的函數(shù)體部分可以在類內,也可以在類外。當成員函數(shù)的定義放在類體外時,必須在類體內對函數(shù)進行聲明,類外定義時應在函數(shù)名前加上類名和作用域限定符“::”。第4章類與對象一般成員函數(shù)可以重載,參數(shù)可以帶有默認值。但是析構函數(shù)不帶參數(shù),不能重載。類體內定義的成員函數(shù)默認為inline函數(shù)。類體外定義的成員函數(shù)默認情況下不是inline,但可以聲明它為inline,只需在函數(shù)聲明以及函數(shù)定義的開始加上關鍵字inline即可。注意這時應將定義類和定義成員函數(shù)的源代碼放在同一個文件中,否則編譯時在函數(shù)調用處無法進行代碼置換。第4章類與對象第4章類與對象第4章類與對象4.1類與對象的定義4.1.2類對象類對象的創(chuàng)建形式和基本數(shù)據(jù)類型對象一樣。例如:inta1,a2,a[3]; //int對象a1、a2和數(shù)組aint*pi=&a1; //指向int對象的指針int&ar=a1; //int對象a1的一個引用arCPointc1,c2,c[3]; //CPoint型CPoint*pc=&c1; //指向CPoint對象的指針CPoint&cr=c1; //CPoint型對象c1的引用1.類對象的定義第4章類與對象4.1.2類對象類代表了某類對象的共同特征,類對象是類的實例(instance)。每個對象分別擁有自己的一套數(shù)據(jù)成員和成員函數(shù)??梢酝ㄟ^對象名(使用運算符“.”)或指向對象的指針(使用運算符“->”)來訪問對象的成員。類的所有非靜態(tài)成員函數(shù)都有隱含一個this指針參數(shù)。當建立類對象時,this就自動被初始化指向該對象??梢远x指向數(shù)據(jù)成員和成員函數(shù)的指針,4.6節(jié)介紹。2.如何訪問類對象的成員運行結果:d1.X=2,d1.Y=3第4章類與對象4.1.2類對象每個對象所占用的存儲空間只是該對象數(shù)據(jù)部分所占用的存儲空間,而不包括函數(shù)代碼部分。同類成員函數(shù)的代碼在內存中只有一份拷貝。但是調用一個對象的成員函數(shù)與調用另一個對象的相同成員函數(shù),傳遞的參數(shù)和執(zhí)行的結果是不一樣的。3.類對象的存儲第4章類與對象4.1類與對象的定義4.1.3類的封裝性和信息隱藏把數(shù)據(jù)和操作數(shù)據(jù)的算法封裝在一起。外界只能通過公有接口實現(xiàn)對數(shù)據(jù)的訪問,而不能直接訪問私有的數(shù)據(jù),這就起到了信息隱藏的作用。將類的接口與實現(xiàn)分離。對于類的用戶來說,只需要知道類的接口、而不需要知道類的實現(xiàn)細節(jié),這樣既保證了程序的安全,又保護了開發(fā)者的權益。參見例4-3。教材中的例子大都比較短小,多數(shù)情況下將所有代碼都放在一個cpp文件中。第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù)

4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員 4.6指向成員的指針 4.7組合類 4.8友元 4.9小結

第4章類與對象4.2構造函數(shù)與析構函數(shù)4.2.1構造函數(shù)1.構造函數(shù)的定義與作用2.帶參數(shù)的構造函數(shù)3.成員初始化列表4.構造函數(shù)的重載5.帶默認參數(shù)值的構造函數(shù)6.拷貝構造函數(shù)7.轉換構造函數(shù)第4章類與對象4.2.1構造函數(shù)1.構造函數(shù)的定義與作用當建立類的對象時,構造函數(shù)自動被調用。構造函數(shù)的名字與類的名字相同,不帶返回類型(注意不是void)。用戶可以根據(jù)初始化的要求設計構造函數(shù)的參數(shù)和函數(shù)體。帶構造函數(shù)的CPoint類定義參見例4-4,作用是建立類對象時對兩個int數(shù)據(jù)成員X和Y初始化。第4章類與對象構造函數(shù)的主要功能是初始化數(shù)據(jù)成員,函數(shù)體內也可以有其他功能的語句,但最好不含與初始化無關的操作,以保持程序的清晰。構造函數(shù)也可以定義在類體外,其函數(shù)名前同樣要加上“類名::”。任何一個類都必須含有構造函數(shù),如果類的設計者沒有定義構造函數(shù),則系統(tǒng)會自動生成一個不帶參數(shù)的構造函數(shù),它只負責創(chuàng)建對象,而不做初始化工作。第4章類與對象第4章類與對象4.2.1構造函數(shù)2.帶參數(shù)的構造函數(shù)帶參數(shù)的構造函數(shù),可以將不同的實參數(shù)值傳遞給構造函數(shù),從而實現(xiàn)不同的初始化。在建立對象時給出實參值,在自動調用構造函數(shù)的同時將實參值傳遞給構造函數(shù),參數(shù)值傳遞的順序與一般函數(shù)一樣是從左到右。第4章類與對象第4章類與對象4.2.1構造函數(shù)3.構造函數(shù)的成員初始化列表前面是在構造函數(shù)的函數(shù)體內對數(shù)據(jù)成員賦初值,也可以在成員初始化列表中初始化,有的數(shù)據(jù)成員則要求必須在列表中初始化。如CPoint構造函數(shù)的定義可寫為:

CPoint(intx,inty):X(x),Y(y){} 調用構造函數(shù)時先執(zhí)行成員初始化列表,再按順序執(zhí)行花括號內的語句。數(shù)據(jù)成員在初始化列表中的初始化順序,與它們在類中的聲明順序有關,而與在初始化列表中給出的順序無關。如果構造函數(shù)在類體外定義,則初始化列表在函數(shù)定義中給出。第4章類與對象第4章類與對象4.2.1構造函數(shù)4.構造函數(shù)的重載構造函數(shù)可以被重載,以提供類對象的不同初始化方法。創(chuàng)建類對象時,如果找不到相匹配的構造函數(shù),那么就不能建立相應的對象。第4章類與對象4.2.1構造函數(shù)5.帶默認參數(shù)值的構造函數(shù)函數(shù)重載增加了源代碼量??梢允褂脦J參數(shù)值的構造函數(shù):

CPoint(intx=0,inty=0){X=x;Y=y;}構造函數(shù)參數(shù)傳遞時,順序是從左到右。如果給出了實參值,則對應的數(shù)據(jù)成員采用實參值作為初值,否則采用默認參數(shù)值作為初值。如果構造函數(shù)在類體之外定義,那么應該在類內聲明構造函數(shù)時為參數(shù)指定默認值。一般要避免同時使用帶默認參數(shù)值的構造函數(shù)和重載構造函數(shù),否則容易出現(xiàn)歧義性問題。第4章類與對象第4章類與對象4.2.1構造函數(shù)6.復制構造函數(shù)有時我們希望像基本數(shù)據(jù)類型那樣,利用已有的類對象去初始化新創(chuàng)建的類對象。例如:inta1=0; inta2(a1); CPointobj1; CPointobj2(obj1); 類對象的這種初始化方式是通過調用復制初始化構造函數(shù)(簡稱復制或拷貝構造函數(shù))實現(xiàn)的。每一個類都必須含有復制構造函數(shù),如果設計人員沒有顯性定義,編譯器會自動生成一個默認的復制構造函數(shù)。復制構造函數(shù)也是構造函數(shù),它的形參類型是類類型的引用,這樣在參數(shù)傳遞時就不用建立新的類對象,而只是對實參的引用。為了保證不修改被引用的對象,通常把引用參數(shù)聲明為const。運行結果:d1.X=4,d1.Y=5d2.X=4,d2.Y=5第4章類與對象在函數(shù)參數(shù)值傳遞(參數(shù)為類類型)、函數(shù)值返回(返回類類型)時也會調用拷貝構造函數(shù)。有時利用系統(tǒng)自動生成的拷貝構造函數(shù)可以滿足要求,但有時需要自己定義,具體我們后面會遇到。第4章類與對象4.2.1構造函數(shù)7.轉換構造函數(shù)利用轉換構造函數(shù)可以將指定的數(shù)據(jù)類型轉換為當前的類類型。例如由int轉換為CPoint。轉換構造函數(shù)實際上是帶默認參數(shù)值的構造函數(shù)。如果構造函數(shù)的參數(shù)從第2個開始都帶有默認值,那么它就可以將第1個參數(shù)的類型自動轉換為當前的類類型。假設定義構造函數(shù):

CPoint::CPoint(intr){X=r;Y=0;}那么語句“CPoint(5);”的功能是:調用轉換構造函數(shù)將5轉換為CPoint類型。本質上是建立一個類對象,數(shù)據(jù)成員初值分別為5和0。調用轉換構造函數(shù)時,要建立一個匿名的臨時對象,該對象使用完畢后被自動刪除。對類型轉換運算符“()”進行重載,可以實現(xiàn)將類類型轉換為其他類型。具體見下一章內容。轉換構造函數(shù)和類型轉換運算符,都是在需要時由系統(tǒng)自動調用。注意4.2.1節(jié)幾種構造函數(shù)形式,是指構造函數(shù)的不同重載形式。在建立類對象需要調用構造函數(shù)時,系統(tǒng)會根據(jù)情況調用其中的一個。第4章類與對象第4章類與對象4.2.2析構函數(shù)析構函數(shù)的作用從內存中刪除類對象。析構函數(shù)的名字是類名前加符號“~”。析構函數(shù)不帶參數(shù),不能重載,也沒有返回類型。其定義形式如下:

Cpoint::~CPoint(){…} 每一個類都必須有析構函數(shù),如果設計者沒有定義,則系統(tǒng)會自動生成一個默認的析構函數(shù),函數(shù)體內為空。析構函數(shù)由系統(tǒng)自動調用,用戶不能隨意調用。classStudent{public: Student() //構造函數(shù)定義

{ number=200801; name=newchar[20]; //申請堆空間

}

~Student(){deletename;}//析構函數(shù)定義private: longintnumber; char*name; //指針型數(shù)據(jù)成員};第4章類與對象第4章類與對象4.2.3構造與析構的順序在同樣的作用域內,調用構造函數(shù)建立類對象的順序是誰的定義在前誰先建立;而調用析構函數(shù)刪除類對象的順序與構造的順序正好相反。調用函數(shù)進行參數(shù)傳遞時,會建立局部的參數(shù)對象,雖然參數(shù)信息傳遞的順序是從左向右,但參數(shù)對象建立的順序是從右向左。當全局對象、靜態(tài)局部對象、一般局部對象都存在的情況下,自動析構順序一般是:先刪除一般局部對象,其次是靜態(tài)局部對象,最后刪除全局對象。用new建立的堆對象,只能通過delete刪除。函數(shù)內定義的非靜態(tài)對象,當這個函數(shù)被調用結束時刪除。第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù)

4.4靜態(tài)成員 4.5常成員 4.6指向成員的指針 4.7組合類 4.8友元 4.9小結

第4章類與對象4.3賦值成員函數(shù)復制構造函數(shù)的作用是:利用已有類對象去初始化新建的類對象。我們也希望類對象能夠像基本數(shù)據(jù)類型的變量那樣可以相互賦值。例如:inta1=0,a2=0; a2=a1; CPointobj1,obj2; obj2=obj1; 類對象的這種賦值方式是通過重載賦值運算符函數(shù)operator=()實現(xiàn)的,該運算符必須重載為類的成員,簡稱賦值函數(shù)。每一個類都必須含有賦值函數(shù),如果設計人員沒有顯性定義,編譯器會自動生成一個。賦值函數(shù)的返回類型和形參類型是類類型的引用,為了保證不修改被引用的對象,通常把引用參數(shù)聲明為const。例如:CPoint&CPoint::operator=(constCPoint&ref){ X=ref.X; //用被引用對象的X值修改當前對象的X Y=ref.Y; //用被引用對象的Y值修改當前對象的Y Return*this; //返回當前對象}賦值函數(shù)和復制構造函數(shù)的實現(xiàn)非常相似。不同的是,賦值函數(shù)返回*this,以符合賦值的本來含義。復制構造函數(shù)用于對象的初始化,而賦值函數(shù)用于修改類對象的值。第4章類與對象一旦定義了賦值函數(shù),就可以像基本數(shù)據(jù)類型對象那樣使用賦值符號“=”。例如:CPointobj1,obj2,obj3;//建立三個類對象obj3=obj2=obj1; 上面的賦值操作,實際上是把obj1作為實參,先調用對象obj2的賦值函數(shù)即

“obj2.operator=(obj1);”,然后把返回值作為實參,再調用對象obj3的賦值函數(shù)。參見例4-13。第4章類與對象有時用戶必須自己定義拷貝構造函數(shù)和賦值函數(shù),例如類中包含指向動態(tài)分配內存的指針成員的情況。classA{public: A(intr){p=newint(r);} //初始化p指向int對象 ~A(){deletep;} //釋放p所指的內存空間private:

int*p; //指針型數(shù)據(jù)成員}; 執(zhí)行下面的一段語句,雖然可以通過編譯連接,但程序運行時會出現(xiàn)問題。Aa(5);//建立A類的對象aAb(a);//建立對象b,復制構造函數(shù)Ac(5),d(10);//建立兩個A類對象d=c;//調用賦值函數(shù)第4章類與對象前面利用默認復制構造函數(shù)和默認賦值函數(shù),造成同一段內存被釋放兩次,或者造成內存資源泄漏。解決辦法:第4章類與對象第4章類與對象Aa(5);//建立A類的對象aAb(a);//建立對象b,復制構造函數(shù)Ac(5),d(10);//建立兩個A類對象d=c;//調用賦值函數(shù)第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員

4.5常成員 4.6指向成員的指針 4.7組合類 4.8友元 4.9小結

第4章類與對象4.4靜態(tài)成員一般地說,如果定義n個同類的對象,那么每個對象的數(shù)據(jù)成員各自有值,互不相關。有時需要某些數(shù)據(jù)成員在同類的多個對象之間可以共享,這可以通過定義靜態(tài)數(shù)據(jù)成員實現(xiàn)。4.4.1靜態(tài)數(shù)據(jù)成員classCPoint{public: CPoint(intx=0,inty=0){X=x

;Y=y

;}private: intX,Y; //一般數(shù)據(jù)成員

static

intcount;//靜態(tài)數(shù)據(jù)成員};intCPoint::count=0;//初始化靜態(tài)數(shù)據(jù)成員count一般數(shù)據(jù)成員是在類對象建立時分配空間,在對象刪除時釋放空間。而靜態(tài)數(shù)據(jù)成員是在程序編譯時分配空間,到程序結束時釋放空間。靜態(tài)數(shù)據(jù)成員在所有對象之外單獨存放,而不占用對象的存儲空間。盡管靜態(tài)數(shù)據(jù)成員的存儲具有全局性,但其作用域僅限于所屬類的范圍。與普通的數(shù)據(jù)成員是一樣,靜態(tài)數(shù)據(jù)成員也有public、private、protected之分。在類外不能訪問private、protected的靜態(tài)數(shù)據(jù)成員,可以訪問public的靜態(tài)數(shù)據(jù)成員,訪問時可以用“類名::”進行限制,或通過類對象訪問。第4章類與對象注意事項:第4章類與對象4.4靜態(tài)成員成員函數(shù)也可以聲明為靜態(tài)的,方法是在類內成員函數(shù)聲明或定義的前面冠以static關鍵字。類外定義時不需要帶static。靜態(tài)成員函數(shù)主要用來訪問類的靜態(tài)成員,不能直接訪問類的非靜態(tài)成員。靜態(tài)成員函數(shù)沒有this指針。與靜態(tài)數(shù)據(jù)成員一樣,類外調用public靜態(tài)成員函數(shù)時,可以用“類名::”進行限制,或通過類對象訪問。4.4.2靜態(tài)成員函數(shù)運行結果:223,4,2第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員

4.6指向成員的指針 4.7組合類 4.8友元 4.9小結

第4章類與對象4.5常成員常數(shù)據(jù)成員的聲明格式如下:

const

數(shù)據(jù)類型數(shù)據(jù)成員名;const數(shù)據(jù)成員必須在構造函數(shù)的成員初始化列表中初始化。對象建立以后,其const數(shù)據(jù)成員的值就不再改變。如果類中包含引用型數(shù)據(jù)成員和其他類類型的數(shù)據(jù)成員,其初始化工作也必須在初始化列表中進行。列表中對成員的初始化順序,與它們在列表中的順序無關,而與它們在類中的聲明順序有關。包含這類數(shù)據(jù)成員的類定義也就不能使用默認構造函數(shù)。4.5.1常數(shù)據(jù)成員第4章類與對象4.5常成員const成員函數(shù)聲明格式如下: 返回類型成員函數(shù)名(參數(shù)列表)const;//const必須有如果const成員函數(shù)定義在類體外,則不論是類內聲明還是類外定義,都不能省略關鍵字const。const成員函數(shù)不能修改任何數(shù)據(jù)成員的值,但可以使用它們。const成員函數(shù)不能調用同類的非const成員函數(shù),但可以調用同類的const成員函數(shù)。如果聲明一個類對象為const,則類外只能調用該對象的公有const成員函數(shù)。4.5.2常成員函數(shù)運行結果:2,2,2,82,2,2,85,5,2,8第4章類與對象4.5常成員如果定義類時聲明一個數(shù)據(jù)成員是mutable,如mutableinta;則表示其值是可以改變的。這時即使是const成員函數(shù),也可以修改mutable數(shù)據(jù)成員的值。mutable不常用。4.5.3mutable第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員 4.6指向成員的指針

4.7組合類 4.8友元 4.9小結

第4章類與對象4.6指向成員的指針可以通過指向成員的指針(簡稱為成員指針),來訪問類對象的成員。C++專門為成員指針準備了三個運算符:“::*”用于聲明成員指針,而“->*”和“.*”用來通過成員指針訪問對象的成員,注意這三個運算符中間不能有空格。參見例4-18。4.6.1成員指針的定義與使用第4章類與對象4.6指向成員的指針一般我們得不到成員函數(shù)的地址。雖然外部函數(shù)的函數(shù)名就代表函數(shù)的入口地址,但成員函數(shù)不是。由于每個成員函數(shù)的類型都是一個獨有的特殊類型,無法轉換到任何其它類型,因此利用成員函數(shù)指針也得不到成員函數(shù)的地址。如果非要得到成員函數(shù)的地址不可,可以使用union類型來逃避C++的類型轉換檢測。參見例4-19。4.6.2如何得到成員函數(shù)的地址第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員 4.6指向成員的指針 4.7組合類

4.8友元 4.9小結

第4章類與對象4.7組合類新類中包含有已經(jīng)定義的其他類類型的數(shù)據(jù)成員,我們稱該新類型為組合類。const數(shù)據(jù)成員、引用型數(shù)據(jù)成員、類類型數(shù)據(jù)成員的初始化操作必須在組合類構造函數(shù)(包括拷貝構造函數(shù)等各種重載形式)的成員初始化列表中進行。有時組合類構造函數(shù)的成員初始化列表中,并沒有明顯給出內部類成員的構造函數(shù),這時調用默認構造函數(shù)。調用析構函數(shù)的順序與調用構造函數(shù)的順序相反。第4章類與對象4.1類與對象的定義 4.2構造函數(shù)與析構函數(shù) 4.3賦值成員函數(shù) 4.4靜態(tài)成員 4.5常成員

溫馨提示

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

評論

0/150

提交評論