## 沒有躲過的坑--C++函數的默認參數(重新定義默認參數)
默認參數指的是當函數調用中省略了實參時,自動使用一個值。
這里首先需要注意的是:?
**對于帶參數列表的函數,必須從右向左添加默認值。**?
也就是說,要為某個參數設置默認值,則必須為它右邊的所有參數提供默認值。
今天遇到的坑兒,就是函數使用默認參數,并且函數的聲明和定義是分開的。
~~~
char* left(const char* str, int n=1);
int main()
{
}
char* left(const char* str, int n = 1)//錯誤
{
}
~~~
上面代碼可以有兩種修改:
1聲明時帶有默認參數,實現時沒有默認值
~~~
char* left(const char* str, int n=1);
int main()
{
}
char* left(const char* str, int n )
{
}
~~~
2實現時帶有默認參數,聲明時沒有默認值
~~~
char* left(const char* str, int n);
int main()
{
}
char* left(const char* str, int n = 1)
{
}
~~~
還有一個我們經常犯的錯誤。?
很多情況,我們可以使用默認參數來替代函數重載:
~~~
void point(int,int){//...}
void point(int a){return point(a,4);}
void point(){return point(3,4);}
~~~
可以用下面的默認參數的函數來替代:
~~~
void point(int=3,int=4);
~~~
當調用“point();”時,即調用“point(3,4);” 它是第3個聲明的重載函數。?
當調用“point(6);”時,即調用“point(6,4);”,它是第2個聲明的重載函數。?
當調用“point(7,8);”時,即調用第1個聲明的重載函數
當你竊喜的時候,如果一組重載函數(可能帶有默認參數)都允許相同實參個數的調用,將會引起調用的二義性。?
~~~
void func(int); //重載函數之一
void func(int,int=4); //重載函數之二,帶有默認參數
void func(int=3,int=4); //重載函數之三,帶有默認參數
func(7); //error: 到底調用3個重載函數中的哪個?
func(20,30) //error:到底調用后面2個重載函數的哪個?
~~~
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常