通常地,不同的過載函式不能具有相同數目的引數和引數型別。函式的返回值型別,雖然屬於成員函式的
signature
的組成部分,但僅僅返回值型別不同,是不能構成函式過載的,因為這會造成
redefinition
的錯誤。
但有乙個例外,就是使用
const
關鍵字進行函式過載,是成員函式成為
const
函式。見下面的**:
// overloading based on const
#include
#include
using
namespace std;
class
aclass
string greeting()
// (1)
//const string greeting()// (2)
////string greeting() const// (3)
//const string greeting() const
// (4)
private
:const string greetingwords;
};int
main(void)
說明:a.
(1)和
(4)中的
greeting
的引數數目和型別都是完全一致的
(兩個函式都沒有引數
),按照通常的說法,這會出現編譯錯誤,但事實上,上面的程式可以正常執行。因此,
(1)和
(4)中的兩個
greeting
函式,並無
redefinition
的問題,這是因為
(4)中的
greeting
函式名稱後有乙個
const
關鍵字的緣故;
b.同樣道理,如果將這個
(4)定義的
greeting
注釋掉,使用
(3)中的
greeting
函式的定義,結果也是正確的,因為
(3)中的
greeting
函式名稱後也有乙個
const
關鍵字;
c.(3)
和(4)
不能同時出現,否則會出現
redefinition
的編譯錯誤。因為它們之間的不同僅是返回值型別不同,乙個是
string
,另乙個是
const string
,而僅僅是返回值型別的不同,編譯器是無法區分兩個過載函式的不同;
d.基於上面的道理,
(1)和
(2)也不能同時出現;
e.結論。如果兩個函式的引數數目和資料型別都是一樣的,只要將其中乙個改為
const
成員函式
(即,函式名稱和引數後又
const
關鍵字)
,則仍然可以構成有效的函式過載;
f.輸出。上面的**輸出:
hello, world! – from nonconst version.
hello, world! – from const – const version.
a_class
是乙個nonconst
物件,因此選擇了
(1)中的
greeting
定義;b_class
是乙個const
物件,因此選擇了
(4)中的
greeting
定義。
C C 函式後有const關鍵字進行限定
我們在宣告乙個函式時,在其後面新增const關鍵字進行限定,表明這個函式是 唯讀 的。也就是說,這個函式不會 不能 修改任何資料成員。宣告乙個const函式很簡單,只要在函式宣告和實現時都用const進行限定即可 如下示例 任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成...
const關鍵字的使用
看到const 關鍵字,c 程式設計師首先想到的可能是const常量。這可不是良好的條件反射。如果只知道用const 定義常量,那麼相當於把火藥僅用於製作鞭炮。const 更大的魅力是它可以修飾函式的引數 返回值,甚至函式的定義體。const 是constant 的縮寫,恆定不變 的意思。被cons...
關鍵字const的使用總結
1.const是一種型別修飾符,用於說明永不改變的物件,const物件一旦定義就無法再改變,所以const物件必須初始化。2.頂層const與底層const區別 位於 左側為底層const,位於 右側為頂層const 頂層const意味著記憶體本身儲存的資料是常量,如int const a 3 即變...