定義一個CPU類,包含等級(Rank)、頻率(frequency)、電壓(voltage)等屬性。其中,rank爲枚舉類型CPU__Rank,定義爲enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency爲單位是MHz的整型數,voltage爲浮點型的電壓值。
函數接口定義:
根據題目要求寫出類。
裁判測試程序樣例:
/* 請在這裏填寫答案 */
int main()
{
CPU a(P6,3,300);
cout<<"cpu a's parameter"<<endl;
a.showinfo(); //顯示性能參數
CPU b;
cout<<"cpu b's parameter"<<endl;
b.showinfo(); //顯示性能參數
CPU c(a);
cout<<"cpu c's parameter"<<endl;
c.showinfo(); //顯示性能參數
}
輸入樣例:
無
輸出樣例:
create a CPU!
cpu a’s parameter
rank:6
frequency:3
voltage:300
create a CPU!
cpu b’s parameter
rank:1
frequency:2
voltage:100
copy create a CPU!
cpu c’s parameter
rank:6
frequency:3
voltage:300
destruct a CPU!
destruct a CPU!
destruct a CPU!
#include<iostream>
using namespace std;
enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};
class CPU{
CPU_Rank Rank;
int frequency;
float voltage;
public:
//帶默認參數的構造函數,默認參數由輸出樣例推出來
CPU(CPU_Rank rank=P1,int f=2,float v=100)
:Rank(rank),frequency(f),voltage(v){
cout<<"create a CPU!\n";
}
//由輸出樣例可知,需要編寫一個拷貝構造函數
CPU(const CPU&c){
Rank=c.Rank;
frequency=c.frequency;
voltage=c.voltage;
cout<<"copy create a CPU!\n";
}
//析構函數
~CPU(){
cout<<"destruct a CPU!\n";
}
void showinfo(){
cout<<"rank:"<<Rank<<endl;
cout<<"frequency:"<<frequency<<endl;
cout<<"voltage:"<<voltage<<endl;
}
};
- 在主函數中,初始化CPU a時用到定義的枚舉類型,故定義枚舉類型時考慮其作用域應該是全局的。所以在類外定義了枚舉類型CPU_Rank
- 其次 做這類題應該仔細觀察給出的輸出樣例,不要漏任何一個細節,不然類定義是寫不對的。例如該題中,觀察到最後三行都輸出了destruct a CPU!很明顯當你在定義類的時候應該在其析構函數中加入該輸出語句。
- 同樣的,在拷貝構造函數中也是如此,一定要記住拷貝構造函數的形參寫法,CPU(CPU& 形參名)是以引用的形式,因爲是拷貝,所以我們作爲一個謹慎的程序員應該保證數據樣本不發生改變,故在前面加上const。
- 下面是有關枚舉的一些基礎知識需要了解
請看下面語句:
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
這條語句完成兩項工作。
-
讓spectrum成爲新類型的名稱:spectrum被稱爲枚舉(enumeration),就像struct變量被稱爲結構一樣。
-
將red、orange、yellow等作爲符號常量,他們對應整數值0~7.這些常量叫作枚舉量(enumerator)。
在默認情況下,將整數值賦給枚舉量,第一個枚舉量的值爲0,第二個枚舉量的值爲1,以此類推。可以通過顯式地指定整數值來覆蓋默認值。
可以用枚舉名來聲明這種類型的變量:
spectrum band;枚舉變量具有一些特殊的屬性
- 在不進行強制類型轉換的情況下,只能將定義枚舉時使用的枚舉量賦給這種枚舉的變量,如下所示
band = blue; //valid,blue is an enumerator
band = 2000; //invalid, 2000 not an enumerator
因此,spectrum變量收到限制,只有8個可能值。如果試圖將一個非法值賦給它,則有些編譯器將出現編譯錯誤,而另一些則發出警告。爲獲得最大限度的可移植性,應將把非enum值賦給enum變量視爲錯誤。 - 對於枚舉,只定義了賦值運算符。具體地說,沒有爲枚舉定義算術運算
band = orange; //valid
++band; //not valid , ++ discussed in Chapter 5
band = orange + red; //not valid, but a little tricky
然而,有些實現並沒有這種限制,這有可能導致違反類型限制。另外,爲獲得最大限度的可移植性,應採納較嚴格的限制。 - 枚舉量是整型,可被提升爲int類型,但int類型不能自動轉換成枚舉類型:
int color = blue ; //valid, spectrum type promoted to int
band = 3; //invalid, int not converted to spectrum
color = 3+red; //valid, red converted to int
雖然在這個例子中,3對應的枚舉量是green,但將3賦給band將導致類型錯誤。不過將green賦給band是可以的,因爲他們都是spectrum類型。同樣,有些實現方法沒有這種限制。表達式3+red中的加法並非爲枚舉量定義,但red被轉換爲int類型,因此結果類型也是int。
前面示例:
band = orange + red ; //not valid , but a little tricky
用於算數表達式中時,枚舉將被轉換爲整數,因此表達式orange+red將被轉換爲1+0.這是一個合法的表達式,但其類型爲int,不能將其賦給類型爲spectrum的變量band。 - 如果int值是有效的,則可以通過強制類型轉換,將它賦給枚舉變量:
band = spectrum(3);
實際上,枚舉更常被用來定義相關的符號常量,而不是新類型。
如果打算只使用常量,而不創建枚舉類型的變量,則可以省略枚舉類型的名稱:
enum {red, orange, yellw, green, blue, violet, indigo, ultraviolet };
設置枚舉量的值
可以使用賦值運算符來顯式設置枚舉量的值:
enum bits { one =1, two =2 , four = 4, eight = 8};
指定的數必須是整數,也可以只顯式地定義其中一些枚舉量的值:
enum bigstep {first, second =100, third };
這裏,first在默認情況下爲0,後面沒有被初始化的枚舉量的值將比前面的枚舉量大1.因此third的值爲101
最後,可以創建多個值相同的枚舉量。
在C++早期的版本中,只能講int值(或提升爲int的值)賦給枚舉量,但這種限制取消了。因此可以使用long甚至long long類型的值。
枚舉的取值範圍
每個枚舉都有取值範圍(range),通過強制類型轉換,可以將取值範圍中的任何整數值賦給枚舉變量,即使這個值不是枚舉值。
例如:假設bits和myflag的定義如下:
enum bit {one = 1, two = 2, four = 4, eight = 8};
bit myflag ;
則下面的代碼將是合法的
myflag = bit (6);
其中6不是枚舉值,但它位於枚舉定義的取值範圍內。
取值範圍的定義如下:首先,要找出上限,需要知道枚舉量的最大值,找到大於這個最大值的,最小的2的冪,將它減去1,得到的便是取值範圍的上限。例如,前面定義的bigstep的最大值枚舉值是101.在2的冪中,比這個數打的最小值是128,因此取值範圍的上限爲127.要計算下限,需要知道枚舉量的最小值,如果它不小於0,則取值範圍的下限爲0.否則,採用與尋找上限的方式相同的方法,但加上負號。
By——Suki
快期末考試了 衝鴨