程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 從軟件工程的角度看const的用法

從軟件工程的角度看const的用法

編輯:關於C++

編碼階段,很多人不太注意const的使用,認為可有可無,如果你開發的是一個簡單的系統,如果你一個人就能記住所有變量的意義,如果你一個人就能控制所有變量的使用位置,如果你的軟件發布後不需要更多的維護工作,那麼你可以忘記const,否則,const就是一個多個程序員之間溝通的強大工具。

首先,const的最基本用法就是標識常量,使編譯器能夠檢測出對該變量的不正確使用,也可以使其他的程序員使用此常量時,注意不能改變此常量。const出現在不同的位置有不同的意義。

√ const int number = 1; // 該變量為常量,以後不能再對它賦值,所以這裡必須賦初值

√ const int * pNumber; // 指向常量的指針,(*pNumber)的值不能改變,但指針pNumber的值可以改變

√ int * const pNumber = & number2; // 指向變量的常量指針,指針的值不能改變,所以必須先初始化

√ const int * const pNumber = & number; // 指向常量的常量指針,常量和指針的值都不能改變,所以必須先初始化

√ const int & number1 = number; // 指向常量的引用,C++中所有的引用都是常量引用,一個引用指向一個變量後,不能再改變值指向另一個變量,所以不論是否說明,引用都是常量引用,必須在初始化時賦初值

其次,C++對函數的參數不區分輸入參數和輸出參數,而且經常由於一個返回值不夠用,我們會傳遞幾個引用或指針來接收返回值。我們可以用const來標明某參數為輸入參數,函數內不會改變此參數的值,如下面一個函數:

bool CopyClass(Value & dest, const Value & src);

其中,Value為用戶定義的類,CopyClass函數的功能為拷貝src的內容到dest,src為輸入參數,其值不能被改變,dest為輸出參數,其他程序員根據函數的定義,就能對函數的功能有個清晰的了解。

下面,讓我們來看一下const的最後一種用法。請看下面CopyClass函數和Value類的實現:

class Value {
public:
int GetValue() { return _value; }
private:
int _value;
}
bool CopyClass(Value & dest, const Value & src) {
int v = src.GetValue();
…………
}

請問:這段代碼能編譯通過嗎?測試一下,果然出現了編譯錯誤,錯誤出現在下面語句:

int v = src.GetValue(); // 編譯錯誤,由於src為指向常量的引用,編譯器無法確定GetValue函數是否改變了src的內容,所以禁止調用

那麼,我們只能放棄使用const標識輸入參數了嗎?不,我們另有辦法,只要把GetValue函數的定義作如下改變即可:

int GetValue() const { return _value; } // const表示對傳遞給它的this指針指向的內容(即Value類)不做任何改變

經過這樣的改變,上述代碼就能編譯通過了,其他的程序員也可以很快的了解到,該成員函數只是輸出類對象的內容,不會改變類對象的任何內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved