const 成員函式過載

2021-07-11 14:59:39 字數 1423 閱讀 2056

先看一段引用[1]:

許多人漠視一件事實:兩個成員函式如果只是常量性(constess)不同,可以被過載

ok,下面為了解釋,定義一下下面這個類:

class cstring

const

char& operator (size_t i) const

//注意這個const 常量,屬於函式簽名,因此導致過載

};

然後有以下應用:

char str = "hello world!";

cstring cstr(str, sizeof(str)/sizeof(char));

const cstring const_cstr(str, sizeof(str)/sizeof(char));

cout

<3]cout

<3]cstr[3] = '1';//ok

const_cstr[3] = '1';//error ,不能通過編譯

然而,如果注釋掉const operator 的版本,在gcc編譯器中,給以下錯誤:

error: passing 『const cstring』 as 『this』 argument discards qualifiers [-fpermissive]

所以,基於對class 本身的設計需求,決定要不要寫兩個版本的operator。

然而對於上述的**,const 版本與非const版本的**僅是相差了乙個常量性的修飾,為了**重用,可以做出以下更改:

class cstring

const

char& operator (size_t i) const

};

注意到,這次我們讓non-const 呼叫了const 版本的函式,但是在呼叫的時候,我們使用了轉型的操作。

首先是為物件本身加上const 屬性,這個使用static_cast

然後返回值去掉const屬性,這個使用const_cast

雖然使用轉型會一定程度上損失效率,但是**重複也是一件惱人的事情。那麼在兩者之間如何抉擇倒是視需求而定了。

在[1]中有句名言:

二八定律:程式80%的時間是由20%的**貢獻的

所以如何去提高程式的執行效率,去思考如何改善那20%的**更為重要:)

參考資料

[1] scott meyers 著, 侯捷譯. effective c++ 中文版: 改善程式技術與設計思維的 55 個有效做法[m]. 電子工業出版社, 2011. (條款03:盡可能使用const)

運算子過載,const成員函式

1.運算子過載 c 為了增強 的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值類 型,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。乙個賦值運算子過載的例子 include includeusing namespace std class mystr mys...

const成員函式

prime c 在類sales item中,same isbn函式定義如下 bool sales item same isbn const sales item rhs const const 成員函式的引入 跟在 sales item 成員函式宣告的形參表後面的 const 所起的作用了 cons...

const成員函式

我們知道,在c 中,若乙個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如,cpp view plain copy const char blank blank n 錯誤 物件導向程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函...