深入理解C++重载函数
生活随笔
收集整理的這篇文章主要介紹了
深入理解C++重载函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深入理解C++重載函數
1.定義:C++允許在同一范圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即函數的參數列表不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。
2.好處:函數重載有什么好處??
重載函數通常用來命名一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的污染,對于程序的可讀性有很大的好處。當函數的編寫者充分考慮了不同情況下應該運行稍有不同的函數,函數的使用者就不必為這些小細節而煩惱了。?
類的構造函數跟類名相同,也就是說:構造函數都同名。如果沒有函數重載機制,要想實例化不同的對象,那是相當的麻煩!
例:
void print(int a)
{
? ? printf("void print(int a)\n");
}
void print(string a) //參數類型不一樣
{
printf("void print(string a)\n");
}
上面兩個就是重載的函數。調用函數時,通過對參數的識別從而調用不同的重載函數。例如在main函數中,如果給的參數是int,那么就會調用上面的那個重載函數,如果給的參數是string,那么就會調用下面的重載函數。
此外,參數個數和順序不同也能構成不同的重載函數。例:
void print(int a ,string b); //參數個數不同
void print(string a ,int b);//參數順序不同
3.構成函數重載的條件如下:?
(1)函數名相同。?
(2)這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即參數列表不同。
需要注意的是,返回值類型不同不構成重載函數。例:
char print(int a ,string b ,string b);
double print(double a);
//這兩個函數和以上的print函數都不是重載函數
4.重載函數的匹配原則:?
(1)嚴格匹配,找到后就調用。?
(2)沒有找到嚴格匹配的函數,但是可以通過隱式轉化,找到適合的重載函數。?
例:
#include<iostream>
#include<stdio.h>
using namespace std;
void count(int a) ? //參數類型為int
{
? ? cout << "void count(int a)" << endl;
}
void count(string a)//參數類型
{
? ? cout << "void count(string a)" << endl;
}
int main()
{
? ? double min = 0.5;
? ? count(min); //實參為double類型
? ? getchar();
? ? return 0;
}
通過隱式轉換可以將double轉為int,然后調用參數類型為int 的函數。?
但是要注意一個問題,就是隱式轉換的規則。?
而且要注意int到long和double,double到int和float的隱式轉換,會引發二義性(ambiguous)。就是有兩個都可行的選擇,計算機無法替你做選擇。(計算機也有選擇困難癥啊。。。。)例:
#include<iostream>
#include<stdio.h>
using namespace std;
void count(double a)//形參類型為double
{
? ? cout << "void count(double a)" << endl;
}
void count(long b)//形參類型為long
{
? ? cout << "void count(long b)" << endl;
}
int main()
{
? ? int min = 10;
? ? count(min);//實參類型為int
? ? getchar();
? ? return 0;
}
此時無法通過編譯。顯示 error C2668: “count”: 對重載函數的調用不明確。即,ambiguous。
5.下面簡單說說函數重載的原理:?
C++采用命名傾軋(name mangling)的技術來改變同名函數,以區分參數不同的函數。?
例:?
void name(char a);通過傾軋->變成類似于void name_c;的形式。?
void name(string a);通過傾軋->變成類似于void name_s;的形式。?
void name(char a, int b);通過傾軋->變成類似于void name_ci;的形式。
name mangling 發生在兩個階段,一個是.cpp編譯時,一個是.h的聲明階段。只有兩個階段同時進行才能匹配上。也就是要同時改名才可以。
1.定義:C++允許在同一范圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即函數的參數列表不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。
2.好處:函數重載有什么好處??
重載函數通常用來命名一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的污染,對于程序的可讀性有很大的好處。當函數的編寫者充分考慮了不同情況下應該運行稍有不同的函數,函數的使用者就不必為這些小細節而煩惱了。?
類的構造函數跟類名相同,也就是說:構造函數都同名。如果沒有函數重載機制,要想實例化不同的對象,那是相當的麻煩!
例:
void print(int a)
{
? ? printf("void print(int a)\n");
}
void print(string a) //參數類型不一樣
{
printf("void print(string a)\n");
}
上面兩個就是重載的函數。調用函數時,通過對參數的識別從而調用不同的重載函數。例如在main函數中,如果給的參數是int,那么就會調用上面的那個重載函數,如果給的參數是string,那么就會調用下面的重載函數。
此外,參數個數和順序不同也能構成不同的重載函數。例:
void print(int a ,string b); //參數個數不同
void print(string a ,int b);//參數順序不同
3.構成函數重載的條件如下:?
(1)函數名相同。?
(2)這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即參數列表不同。
需要注意的是,返回值類型不同不構成重載函數。例:
char print(int a ,string b ,string b);
double print(double a);
//這兩個函數和以上的print函數都不是重載函數
4.重載函數的匹配原則:?
(1)嚴格匹配,找到后就調用。?
(2)沒有找到嚴格匹配的函數,但是可以通過隱式轉化,找到適合的重載函數。?
例:
#include<iostream>
#include<stdio.h>
using namespace std;
void count(int a) ? //參數類型為int
{
? ? cout << "void count(int a)" << endl;
}
void count(string a)//參數類型
{
? ? cout << "void count(string a)" << endl;
}
int main()
{
? ? double min = 0.5;
? ? count(min); //實參為double類型
? ? getchar();
? ? return 0;
}
通過隱式轉換可以將double轉為int,然后調用參數類型為int 的函數。?
但是要注意一個問題,就是隱式轉換的規則。?
而且要注意int到long和double,double到int和float的隱式轉換,會引發二義性(ambiguous)。就是有兩個都可行的選擇,計算機無法替你做選擇。(計算機也有選擇困難癥啊。。。。)例:
#include<iostream>
#include<stdio.h>
using namespace std;
void count(double a)//形參類型為double
{
? ? cout << "void count(double a)" << endl;
}
void count(long b)//形參類型為long
{
? ? cout << "void count(long b)" << endl;
}
int main()
{
? ? int min = 10;
? ? count(min);//實參類型為int
? ? getchar();
? ? return 0;
}
此時無法通過編譯。顯示 error C2668: “count”: 對重載函數的調用不明確。即,ambiguous。
5.下面簡單說說函數重載的原理:?
C++采用命名傾軋(name mangling)的技術來改變同名函數,以區分參數不同的函數。?
例:?
void name(char a);通過傾軋->變成類似于void name_c;的形式。?
void name(string a);通過傾軋->變成類似于void name_s;的形式。?
void name(char a, int b);通過傾軋->變成類似于void name_ci;的形式。
name mangling 發生在兩個階段,一個是.cpp編譯時,一個是.h的聲明階段。只有兩個階段同時進行才能匹配上。也就是要同時改名才可以。
總結
以上是生活随笔為你收集整理的深入理解C++重载函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NULL、0、nullptr的区别?
- 下一篇: C/C++中未定义行为