關於引數和返回值的常量性

2021-09-08 07:15:15 字數 1418 閱讀 6972

什麼時候引數應該是常量的?

什麼時候返回值應該是常量的?

在回答這兩個問題之前首先看一下為什麼要將引數和返回值設定為常量?一句話,為了防止使用者修改引數或者返回值

大多數set***()函式的引數都應該是常量性的,因為我們要設定某個值,不需要改變引數,只需將其賦值給要修改的值即可

而大多數的get***()函式的返回值都應該是常量性的,因為我們只想得到某個值,而不想改變它

還需要注意的一點就是,只有指標或者引用型別才有必要設定為常量性,對於值型別,沒有必要,因為傳值時傳進去的/或者返回的是乙個副本,改變副本並不會影響原來的值,所以值型別沒有必要設定為常量,當然設定了也不算錯。

c#中有屬性,可以通過屬性暴露私有成員,但是c++中沒有屬性,所以只能用get***和set***來實現,其實本質都一樣。防止使用者直接操作私有成員。看下面的sphere類,這是乙個標準的get/set的寫法

class sphere
sphere(d3dxvector3& center, float radius):m_vcenter(center), m_fradius(radius){}
const d3dxvector3& getcenter() const
void setcenter(const d3dxvector3& center)
float getradius() const
void setradius(float radius)
private:
d3dxvector3  m_vcenter ;  // center of the sphere
float    m_fradius ;  // radius of the sphere
};
解釋一下

1. 類的成員函式如果不修改類的成員,如上面的getradius和getcenter函式,那麼將該函式設定為const函式

2. setcenter函式的引數是引用型別,為了防止使用者修改該引數,將其設定為常量

3. setradius函式的引數是值型別,由於是傳值,所以不會改變原來的值,不必設定為常量

4. getcenter函式返回引用型別,為了防止使用者修改返回值,所以將返回值設定為常量

5. getradius函式返回值型別,其實是原來的值的乙個副本,改了也無所謂,所以不必設定為常量

引用型別和指標型別實際上多了一層間接性,不像值型別那樣可以直接操作,更重要的是傳遞指標或引用能大大提高效率,如果直接傳遞物件本身,開銷是很大的,但是這層間接性也導致了不安全性,通過指標或者引用可以修改目標的值,為了防止修改,所以能使用常量的地方盡量使用常量。

引數和返回值

基本資料型別 這裡所說的形式引數對基本資料型別不做研究 引用資料型別 引數是具體類時 建立引用資料型別 使用匿名類 new 類名 使用匿名內部類的方式 父類名或者父類介面 物件名 new 父類名或者父類介面 引數是抽象類時 可以使用抽象類多型 建立抽象類的子類 使用匿名內部類的方式 父類名或者父類介...

函式返回值常量

const修飾函式返回值 注 此處只討論語法,實用性暫不考慮 返回非常量複雜型別的值則可以為左值,返回為int,即使不是const也不可以為左值,返回類或者結構體可以為左值 此處可能是因為複雜型別有預設的賦值函式 返回常量時,不可為左值,可以賦值給變數,不可賦值給非常量引用 舉例 include i...

引數 返回值

1.函式 函式是對功能的封裝 語法 def 函式名 形參列表 函式體 塊,return 呼叫 函式名 實參列表 2.返回值 return 在函式執行的時候.如果遇到return.直接返回 1.如果函式什麼都不寫,不寫return,沒有返回值.得到的是none 2.在函式中間或者末尾寫return,返...