C++類和對象函數題——6-3 創建CPU(含說明和枚舉基本知識)

定義一個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;

    枚舉變量具有一些特殊的屬性

  1. 在不進行強制類型轉換的情況下,只能將定義枚舉時使用的枚舉量賦給這種枚舉的變量,如下所示
    band = blue; //valid,blue is an enumerator
    band = 2000; //invalid, 2000 not an enumerator

    因此,spectrum變量收到限制,只有8個可能值。如果試圖將一個非法值賦給它,則有些編譯器將出現編譯錯誤,而另一些則發出警告。爲獲得最大限度的可移植性,應將把非enum值賦給enum變量視爲錯誤。
  2. 對於枚舉,只定義了賦值運算符。具體地說,沒有爲枚舉定義算術運算
    band = orange; //valid
    ++band; //not valid , ++ discussed in Chapter 5
    band = orange + red; //not valid, but a little tricky

    然而,有些實現並沒有這種限制,這有可能導致違反類型限制。另外,爲獲得最大限度的可移植性,應採納較嚴格的限制。
  3. 枚舉量是整型,可被提升爲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。
  4. 如果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
快期末考試了 衝鴨
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章