版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、程序設計 cs.sjtu 2011.9程序設計 - 1v什么是運算符重載什么是運算符重載 v運算符重載的方法運算符重載的方法 v幾個特殊的運算符的重載幾個特殊的運算符的重載 v自定義類型轉換運算符自定義類型轉換運算符v運算符重載實例運算符重載實例 程序設計 cs.sjtu 2011.9程序設計 - 2v使系統(tǒng)內(nèi)置的運算符可以用于類類型使系統(tǒng)內(nèi)置的運算符可以用于類類型v例如:例如:+ + 運算符能夠實現(xiàn)運算符能夠實現(xiàn)2 2個對象間的個對象間的加。例如:類加。例如:類a a的對象的對象a1a1、a2a2、a3a3,希,希望:望: a3 = a1 + a2a3 = a1 + a2; 即:分別把對象即
2、:分別把對象a1a1和和a2a2的各個數(shù)據(jù)成員的各個數(shù)據(jù)成員值對應相加,然后賦給對象值對應相加,然后賦給對象a3a3。程序設計 cs.sjtu 2011.9程序設計 - 3v把某些事交給系統(tǒng)去做,用戶只要知道把某些事交給系統(tǒng)去做,用戶只要知道相加就可相加就可v擴充運算符的功能擴充運算符的功能v增強了增強了c+ c+ 語言的可擴充性語言的可擴充性v使用戶定義的類更像系統(tǒng)的內(nèi)置類型使用戶定義的類更像系統(tǒng)的內(nèi)置類型程序設計 cs.sjtu 2011.9程序設計 - 4v不是所有的運算符都能重載不是所有的運算符都能重載v重載不能改變運算符的優(yōu)先級和結合性重載不能改變運算符的優(yōu)先級和結合性v重載不能改變
3、運算符的操作數(shù)個數(shù)重載不能改變運算符的操作數(shù)個數(shù)v不能創(chuàng)建新的運算符不能創(chuàng)建新的運算符程序設計 cs.sjtu 2011.9程序設計 - 5 + - * / % & | ! = += -= *= /= %= = &= |= = = = != = & | + - -* , - () new delete new delete程序設計 cs.sjtu 2011.9程序設計 - 6 . .* : ?: sizeof 程序設計 cs.sjtu 2011.9程序設計 - 7v什么是運算符重載什么是運算符重載 v運算符重載的方法運算符重載的方法 v幾個特殊的運算符的重載幾個特殊的運算符的重載 v自定義類型
4、轉換運算符自定義類型轉換運算符v運算符重載實例運算符重載實例 程序設計 cs.sjtu 2011.9程序設計 - 8v運算符重載就是寫一個函數(shù)解釋某個運算符運算符重載就是寫一個函數(shù)解釋某個運算符在某個類中的含義在某個類中的含義v要使得系統(tǒng)能自動找到重載的這個函數(shù),函要使得系統(tǒng)能自動找到重載的這個函數(shù),函數(shù)名必須要體現(xiàn)出和某個被重載的運算符的數(shù)名必須要體現(xiàn)出和某個被重載的運算符的聯(lián)系。聯(lián)系。vc+中規(guī)定,重載函數(shù)名為中規(guī)定,重載函數(shù)名為 operator 其中,其中,為要重載的運算符。如要重載為要重載的運算符。如要重載“+”運算符,該重載函數(shù)名為運算符,該重載函數(shù)名為operator+。要重載。
5、要重載賦值運算符,函數(shù)名為賦值運算符,函數(shù)名為operator=。 程序設計 cs.sjtu 2011.9程序設計 - 9v運算符的重載不能改變運算符的運算對象數(shù)。因此,重載運算符的重載不能改變運算符的運算對象數(shù)。因此,重載函數(shù)的形式參數(shù)個數(shù)(包括成員函數(shù)的隱式指針函數(shù)的形式參數(shù)個數(shù)(包括成員函數(shù)的隱式指針this)與運)與運算符的運算對象數(shù)相同算符的運算對象數(shù)相同 v運算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實運算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實現(xiàn)。重載成全局函數(shù)時,最好把此函數(shù)設為友員函數(shù)現(xiàn)。重載成全局函數(shù)時,最好把此函數(shù)設為友員函數(shù)v如果作為類的成員函數(shù),它的形式參數(shù)
6、個數(shù)比運算符的運如果作為類的成員函數(shù),它的形式參數(shù)個數(shù)比運算符的運算對象數(shù)少算對象數(shù)少1。這是因為成員函數(shù)有一個隱含的參數(shù)。這是因為成員函數(shù)有一個隱含的參數(shù)this。在在c+中,把隱含參數(shù)中,把隱含參數(shù)this作為運算符的第一個參數(shù)。作為運算符的第一個參數(shù)。v當把一個一元運算符重載成成員函數(shù)時,該函數(shù)沒有形式當把一個一元運算符重載成成員函數(shù)時,該函數(shù)沒有形式參數(shù)。參數(shù)。v把一個二元運算符重載成成員函數(shù)時,該函數(shù)只有一個形把一個二元運算符重載成成員函數(shù)時,該函數(shù)只有一個形式參數(shù),就是右操作數(shù),當前對象是左操作數(shù)。式參數(shù),就是右操作數(shù),當前對象是左操作數(shù)。程序設計 cs.sjtu 2011.9程序
7、設計 - 10v為為rational類增加類增加“+”和和“*”以及比較以及比較的重載函數(shù),用以替換現(xiàn)有的的重載函數(shù),用以替換現(xiàn)有的add和和multi函數(shù)函數(shù) 程序設計 cs.sjtu 2011.9程序設計 - 11class rational private:int num;int den;void reductfraction();public:rational(int n = 0, int d = 1) num = n; den = d; rational operator+(const rational &r1) const; rational operator*(const rat
8、ional &r1) const; bool operator(const rational &r1) const; bool operator=(const rational &r1) const; bool operator!=(const rational &r1) const; void display() cout num / den; 程序設計 cs.sjtu 2011.9程序設計 - 12rational rational:operator+(const rational &r1) const rational tmp; tmp.num = num * r1.den + r1.n
9、um * den; tmp.den = den * r1.den; tmp.reductfraction(); return tmp;rational rational:operator*(const rational &r1) const rational tmp; tmp.num = num * r1.num; tmp.den = den * r1.den; tmp.reductfraction(); return tmp; 程序設計 cs.sjtu 2011.9程序設計 - 13bool rational:operator(const rational &r1) const return
10、 num * r1.den (const rational &r1) const return num * r1.den den * r1.num; bool rational:operator=(const rational &r1) const return num * r1.den =(const rational &r1) const return num * r1.den = den * r1.num; bool rational:operator!=(const rational &r1) const return !(*this = r1);程序設計 cs.sjtu 2011.9
11、程序設計 - 14class rational friend rational operator+(const rational &r1, const rational &r2); friend rational operator*(const rational &r1 , const rational &r2); friend bool operator(const rational &r1 , const rational &r2) ; friend bool operator=(const rational &r1 , const rational &r2); friend bool o
12、perator!=(const rational &r1 , const rational &r2) ; private: int num;int den;void reductfraction();public:rational(int n = 0, int d = 1) num = n; den = d;void display() cout num / den;程序設計 cs.sjtu 2011.9程序設計 - 15rational operator+(const rational &r1, const rational &r2) rational tmp; tmp.num = r1.n
13、um * r2.den + r2.num * r1.den; tmp.den = r1.den * r2.den; tmp.reductfraction(); return tmp;rational operator*(const rational &r1, const rational &r2) rational tmp; tmp.num = r1.num * r2.num; tmp.den = r1.den * r2.den; tmp.reductfraction(); return tmp; 其他函數(shù)實現(xiàn)略其他函數(shù)實現(xiàn)略程序設計 cs.sjtu 2011.9程序設計 - 16int ma
14、in() rational r1(1,6), r2(1,6), r3; r3 = r1 + r2; r1.display(); cout + ; r2.display(); cout = ; r3.display(); cout endl; r3 = r1 * r2; r1.display(); cout * ; r2.display(); cout = ; r3.display(); cout )必須重載成成員函數(shù)。)必須重載成成員函數(shù)。v具有賦值意義的運算符,如復合的賦值運算符以及具有賦值意義的運算符,如復合的賦值運算符以及+和和-,不一定非要定義為成員函數(shù),但最好定義為成員函數(shù),不一定非
15、要定義為成員函數(shù),但最好定義為成員函數(shù)。v具有兩個運算對象的運算符最好重載為全局函數(shù),這樣具有兩個運算對象的運算符最好重載為全局函數(shù),這樣可以使得應用更加靈活。如果把加運算定義成全局函數(shù)可以使得應用更加靈活。如果把加運算定義成全局函數(shù),r是有理數(shù)類的對象,則是有理數(shù)類的對象,則2+r是一個合法的表達式。是一個合法的表達式。程序設計 cs.sjtu 2011.9程序設計 - 18v什么是運算符重載什么是運算符重載 v運算符重載的方法運算符重載的方法 v幾個特殊的運算符的重載幾個特殊的運算符的重載 v自定義類型轉換運算符自定義類型轉換運算符v運算符重載實例運算符重載實例 程序設計 cs.sjtu
16、2011.9程序設計 - 19v賦值運算符賦值運算符 v下標運算符下標運算符v函數(shù)調(diào)用運算符函數(shù)調(diào)用運算符 v+和和運算符的重載運算符的重載 v重載函數(shù)的原型設計考慮重載函數(shù)的原型設計考慮v輸入輸出運算符重載輸入輸出運算符重載 程序設計 cs.sjtu 2011.9程序設計 - 20v對任一類,如果用戶沒有自定義賦值運算對任一類,如果用戶沒有自定義賦值運算符函數(shù),那么系統(tǒng)為其生成一個缺省的賦符函數(shù),那么系統(tǒng)為其生成一個缺省的賦值運算符函數(shù),在對應的數(shù)據(jù)成員間賦值值運算符函數(shù),在對應的數(shù)據(jù)成員間賦值。v一般情況下,這個缺省的賦值運算符重載一般情況下,這個缺省的賦值運算符重載函數(shù)能滿足用戶的需求。
17、但是,當類含有函數(shù)能滿足用戶的需求。但是,當類含有類型為指針的數(shù)據(jù)成員時,可能會帶來一類型為指針的數(shù)據(jù)成員時,可能會帶來一些麻煩。些麻煩。 程序設計 cs.sjtu 2011.9程序設計 - 21v會引起內(nèi)存泄漏會引起內(nèi)存泄漏v使這兩個數(shù)組的元素存放于同一塊空間中使這兩個數(shù)組的元素存放于同一塊空間中v當這兩個對象析構時,先析構的對象會釋當這兩個對象析構時,先析構的對象會釋放存儲數(shù)組元素的空間。而當后一個對象放存儲數(shù)組元素的空間。而當后一個對象析構時,無法釋放存放數(shù)組元素的空間析構時,無法釋放存放數(shù)組元素的空間程序設計 cs.sjtu 2011.9程序設計 - 22v賦值運算符只能重載成成員函數(shù)
18、賦值運算符只能重載成成員函數(shù)v函數(shù)原型:函數(shù)原型: x &x:operator=(const x &source) / 賦值過程賦值過程 一旦創(chuàng)建了對象一旦創(chuàng)建了對象x1, x2, 可以用可以用 x1 = x2賦值。賦值。程序設計 cs.sjtu 2011.9程序設計 - 23doublearray &doublearray:operator= (const doublearray &right) if (this = &right) return *this; delete storage; low = right.low; high = right.high; storage = new
19、doublehigh - low + 1; for (int i=0; i = high - low; +i) storagei = right.storagei; /復制數(shù)組元素復制數(shù)組元素 return *this; 程序設計 cs.sjtu 2011.9程序設計 - 24v一般來講,需要自定義拷貝構造函數(shù)的類也需要一般來講,需要自定義拷貝構造函數(shù)的類也需要自定義賦值運算符重載函數(shù)。自定義賦值運算符重載函數(shù)。v在賦值運算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值在賦值運算符重載函數(shù)中,已經(jīng)將參數(shù)的值賦值給了當前對象,那為什么還需要返回值呢?記住給了當前對象,那為什么還需要返回值呢?記住,在,在c+中
20、,賦值是一個運算,它可以形成一個中,賦值是一個運算,它可以形成一個表達式,而該表達式的結果值就是賦給左邊的對表達式,而該表達式的結果值就是賦給左邊的對象的值。因此,賦值運算符重載函數(shù)必須返回賦象的值。因此,賦值運算符重載函數(shù)必須返回賦給左邊的對象值。給左邊的對象值。程序設計 cs.sjtu 2011.9程序設計 - 25v一般來講,需要拷貝構造函數(shù)的類也需一般來講,需要拷貝構造函數(shù)的類也需要重載賦值運算符要重載賦值運算符v定義對象時給對象賦初值調(diào)用的是拷貝定義對象時給對象賦初值調(diào)用的是拷貝構造函數(shù)構造函數(shù)v程序的語句部分中的賦值語句調(diào)用的是程序的語句部分中的賦值語句調(diào)用的是賦值運算符重載函數(shù)賦
21、值運算符重載函數(shù)程序設計 cs.sjtu 2011.9程序設計 - 26v賦值運算符賦值運算符 v下標運算符下標運算符v函數(shù)調(diào)用運算符函數(shù)調(diào)用運算符 v+和和運算符的重載運算符的重載 v重載函數(shù)的原型設計考慮重載函數(shù)的原型設計考慮v輸入輸出運算符重載輸入輸出運算符重載 程序設計 cs.sjtu 2011.9程序設計 - 27v能否象普通的數(shù)組那樣通過下標運算操作能否象普通的數(shù)組那樣通過下標運算操作doublearray類的對象,這樣可以使類的對象,這樣可以使doublearray類更像一個功能內(nèi)置的數(shù)組。類更像一個功能內(nèi)置的數(shù)組。v可以通過重載下標運算符(可以通過重載下標運算符()來實現(xiàn))來實
22、現(xiàn) v下標運算符是二元運算符,第一個運算數(shù)是下標運算符是二元運算符,第一個運算數(shù)是數(shù)組名,第二個運算數(shù)是下標值數(shù)組名,第二個運算數(shù)是下標值v下標運算符必須重載成成員函數(shù)下標運算符必須重載成成員函數(shù)程序設計 cs.sjtu 2011.9程序設計 - 28double & doublearray:operator(int index) if (index high) cout 下標越界下標越界; exit(-1); return storageindex - low; 程序設計 cs.sjtu 2011.9程序設計 - 29v定義:定義:doublearray array(20, 30);v數(shù)組輸
23、入:數(shù)組輸入: for (i=20; i=30; +i) cout 請輸入第請輸入第 i arrayi; v數(shù)組輸出:數(shù)組輸出: for (i=20; i=30; +i) cout arrayi end | start high ) cout 下標越界下標越界; exit(-1); doublearray tmp(lh, lh + end - start); for (int i = 0; i end - start + 1; +i) tmp.storagei = storagestart + i - low;return tmp; 程序設計 cs.sjtu 2011.9程序設計 - 35v賦
24、值運算符賦值運算符 v下標運算符下標運算符v函數(shù)調(diào)用運算符函數(shù)調(diào)用運算符 v+和和運算符的重載運算符的重載 v重載函數(shù)的原型設計考慮重載函數(shù)的原型設計考慮v輸入輸出運算符重載輸入輸出運算符重載 程序設計 cs.sjtu 2011.9程序設計 - 36v、- - -:是一元操作符:是一元操作符v這兩個操作符可以是前綴,也可以是后這兩個操作符可以是前綴,也可以是后綴。而且前綴和后綴的含義是有區(qū)別的綴。而且前綴和后綴的含義是有區(qū)別的。所以,必須有兩個重載函數(shù)。所以,必須有兩個重載函數(shù)。 v問題:兩個重載函數(shù)有相同的原型問題:兩個重載函數(shù)有相同的原型v區(qū)分方法:區(qū)分方法: 前綴:一元操作符。前綴:一元
25、操作符。 后綴:二元操作符。后綴:二元操作符。程序設計 cs.sjtu 2011.9程序設計 - 37v成員函數(shù)重載成員函數(shù)重載 +ob重載為:重載為:ob.operator+() ob- 重載為:重載為:ob.operator-(int)v友元函數(shù)重載友元函數(shù)重載 +ob重載為:重載為:operator+(x &ob) ob-重載為:重載為:operator-(x &ob, int)v調(diào)用時,參數(shù)調(diào)用時,參數(shù)int一般傳遞給值一般傳遞給值0。程序設計 cs.sjtu 2011.9程序設計 - 38v設計一個會報警的計數(shù)器類。該計數(shù)器設計一個會報警的計數(shù)器類。該計數(shù)器從從0開始計數(shù),當?shù)竭_預先
26、設定好的報開始計數(shù),當?shù)竭_預先設定好的報警值時,計數(shù)器會發(fā)出報警消息,計數(shù)警值時,計數(shù)器會發(fā)出報警消息,計數(shù)器的值不再增加。器的值不再增加。 程序設計 cs.sjtu 2011.9程序設計 - 39class counter int value; /計數(shù)器的值計數(shù)器的值int alarm; /報警值報警值public:counter(int a) value = 0; alarm = a;counter & operator+(); /前綴的前綴的+重載重載counter operator+(int); /后綴的后綴的+重載重載void print() cout value endl; ; 程
27、序設計 cs.sjtu 2011.9程序設計 - 40counter & counter:operator+() if (value = alarm) cout 已超過報警值已超過報警值n; else +value; if (value = alarm) cout 已到達報警值已到達報警值n; return *this;counter counter:operator+(int x) counter tmp = *this; /保存對象修改前的狀態(tài)保存對象修改前的狀態(tài) if (value = alarm) cout 已超過報警值已超過報警值n; else +value; if (value =
28、 alarm) cout )()和流提取運算符和流提取運算符()()輸入和輸出用戶自定輸入和輸出用戶自定義類的對象義類的對象程序設計 cs.sjtu 2011.9程序設計 - 48ostream & operator(ostream & os, const classtype &obj) os 要輸出的內(nèi)容;要輸出的內(nèi)容; return os; 程序設計 cs.sjtu 2011.9程序設計 - 49ostream& operator(ostream &os, const rational& obj) / 輸出重載函數(shù)輸出重載函數(shù) os obj.num / obj.den; return os
29、;如定義:如定義:rational r(2,6);執(zhí)行執(zhí)行cout )()和流提取運算符和流提取運算符()(istream & is, classtype &obj) is 要輸入的內(nèi)容;要輸入的內(nèi)容; return is; 程序設計 cs.sjtu 2011.9程序設計 - 52istream& operator(istream &in, rational& obj) / 輸入重載函數(shù)輸入重載函數(shù) in obj.num obj.den; obj.reductfraction(); return in;如定義:如定義:rational r;可以用可以用cin r 從鍵盤輸入從鍵盤輸入r的數(shù)據(jù)。
30、如輸入為:的數(shù)據(jù)。如輸入為:1 3執(zhí)行執(zhí)行cout (istream &in, rational& obj); friend ostream& operator(ostream &os, const rational& obj); friend rational operator+(const rational &r1, const rational &r2); friend rational operator*(const rational &r1, const rational &r2); private: int num;int den;void reductfraction();pub
31、lic:rational(int n = 0, int d = 1) num = n; den = d;operator double () const return (double(num)/den); 程序設計 cs.sjtu 2011.9程序設計 - 63#include #include rational.hint main() rational r1, r2, r3, r4; double x; cout r1; cout r2; r3 = r1 + r2; cout r1 + r2 = r3 endl; r3 = r1 * r2; cout r1 * r2 = r3 endl; r
32、4 = (r1 + r2) * r3; cout (r1 + r2) * r3的值為:的值為: r4 endl; x = 5.5 - r1; cout 5.5 - r1的值為:的值為: x endl; cout (r1 r2 ? r1 : r2) endl; return 0; 輸入輸入r1: 1 3輸入輸入r2: 2 61/3+1/3 = 2/31/3*1/3 = 1/9(r1 + r2) * r3的值為的值為2/275.5 - r1的值為:的值為:5.166671/3 程序設計 cs.sjtu 2011.9程序設計 - 64v什么是運算符重載什么是運算符重載 v運算符重載的方法運算符重載的
33、方法 v幾個特殊的運算符的重載幾個特殊的運算符的重載 v自定義類型轉換運算符自定義類型轉換運算符 v運算符重載實例運算符重載實例程序設計 cs.sjtu 2011.9程序設計 - 65v完善完善doublearray類類程序設計 cs.sjtu 2011.9程序設計 - 66#ifndef _array_h#define _array_h#include class doublearrayfriend ostream &operator(istream &is, doublearray &obj);friend bool operator=(const doublearray &obj1, c
34、onst doublearray &obj2);private: int low; int high; double *storage;程序設計 cs.sjtu 2011.9程序設計 - 67public: doublearray(int lh = 0, int rh = 0):low(lh), high(rh) storage = new double high - low + 1; doublearray(const doublearray &arr); doublearray &operator=(const doublearray &right); double & operator(
35、int index); const double & operator(int index) const; doublearray operator()(int start, int end, int lh); doublearray() delete storage; ;#endif程序設計 cs.sjtu 2011.9程序設計 - 68/文件名:文件名:doublearray.cpp/doublearray類的實現(xiàn)類的實現(xiàn)#include #include doublearray.h“doublearray:doublearray(const doublearray &arr) low =
36、 arr.low; high = arr.high; storage = new double high - low + 1; for (int i = 0; i high -low + 1; +i) storagei = arr.storagei;程序設計 cs.sjtu 2011.9程序設計 - 69doublearray &doublearray:operator= (const doublearray & a) if (this = &a) return *this; delete storage; low = a.low; high = a.high; storage = new d
37、oublehigh - low + 1; for (int i=0; i = low & index = low & index = high); return storageindex - low; 程序設計 cs.sjtu 2011.9程序設計 - 71ostream &operator(ostream &os, const doublearray &obj) os 數(shù)組內(nèi)容為:數(shù)組內(nèi)容為:n; for (int i=obj.low; i=obj.high; +i) os obji t; os ( istream &is, doublearray &obj) cout 請輸入數(shù)組元素請輸入數(shù)組元素 obj.low , obj.high :n; for (int i=obj.low; i obji ; r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44591-2024農(nóng)業(yè)社會化服務社區(qū)生鮮店服務規(guī)范
- 2024年二手車買賣合同協(xié)議
- 房產(chǎn)證購房合同格式
- 新式勞務合同范例模板
- 2024裝修工程結算協(xié)議
- 出租車公司車輛轉讓合同樣本
- 股權激勵合同范本
- 技術開發(fā)保密合同樣本
- 小區(qū)環(huán)境整治施工合同
- 就業(yè)安置協(xié)議書撰寫心得
- 玻璃幕墻工程施工質量控制方法與措施
- 慢性淋巴細胞白血病-課件
- 銷售逼單成交話術及技巧
- 《影響人類文明的里程碑》課件
- 《針織學》期末考試試卷附答案
- 風電場地質勘察設計方案
- 橫河UT35A-32A-操作手冊
- 計算機網(wǎng)絡(第三版)課件(完整版)
- 《紅樓夢》指導第二課 命名
- 關于建立企業(yè)干部職工末等調(diào)整和不勝任退出機制的實施方案
- 水利工程工程量清單計價解讀講解課件
評論
0/150
提交評論