函數簽名是指函數的參數個數,參數類型以及參數的順序。重載的定義是:在同一做用域內函數簽名不一樣但函數名相同的函數互爲重載。函數
// 如下幾個函數互爲重載 void print(); void print(int a); void print(double a, int b); void print(int a, double b); void print(string a, double b);
參數的不一樣也能夠是經過const
區分的。this
// 如下兩個函數一樣造成函數重載 void print(int &a); void print(const int &a);
// 聲明成員函數爲const即指定this指針爲const,一樣能夠構成重載 class LiF { public: void print(); void print() const; };
函數的形參名不一樣或返回值類型不一樣並不構成重載,而且編譯報錯,由於這類函數被編譯器識別爲相同函數。指針
// 重定義print,編譯報錯 void print(int a); void print(int b);
// 重定義print,編譯報錯 void print(int a); int print(int a);
在C++的編譯期,編譯器會根據參數列表對函數進行重命名,在函數名中按順序加入參數類型以區分重載的函數。在函數調用時,則會根據實參類型逐個匹配重載的函數,失配則報錯。也就是說,重載只是語法上的重載,重載的函數在編譯後仍然是不一樣的函數。這也就解釋了爲何只有函數簽名不一樣的函數才能構成重載。在編譯完成以後,函數的重載也就肯定了。所以能夠說,重載提供的多態性是靜態的,或者說重載提供了編譯期的多態性。code