c++中 預設定義 函式過載 引用
##概要
本片部落格 的主要內容有, c++中函式預設定義、 函式過載的機制 、函式名在VS環境下編譯後的修改,引用 及其 注意事項。最後列了一個表
文章目錄
預設定義
預設引數
預設引數是宣告或者定義函式的引數的時候指定一個預設值。在呼叫該函式時候。如果沒有指定實參,那麼就採用預設值進行處理。
void TestRet(int number = 10)
{
cout << number <<endl;
}
int main()
{
TestRet();
TestRet(100);
return 0;
}
以上函式中,第一個TestRet將列印預設值 10。第二個TestRet將列印傳輸值 100。
預設引數的分類
全預設引數 :所有的引數都帶有預設值。
int TestFunc(int a=10,int b=20,int c=30)
{
cout<< a <<endl;
cout<< b <<endl;
cout<< c <<endl;
}
半預設引數 : 只能從右向左依次寫入預設
int TestFunc(int a=10,int b=20,int c)
{
cout<< a <<endl;
cout<< b << endl;
cout<< c <<endl;
}
注意事項:
1.半預設引數必須從右向左來寫入,不能間隔著寫出來
2.預設引數不能同時在宣告和定位的位置,要麼在函式宣告的時候設定好預設,要麼在定義函式的時候設定預設。
3.預設的值必須是常量,和全域性變數
函式過載
過載的定義
函式過載的概念:對於同一個作用域來說,函式的名字必須相同,引數列表必須不同。其中引數列表包含了引數的個數,引數的型別,型別的次序,與返回值的型別沒有關係.
一下例子是錯誤的
long TestRet(double a ,double b)
{
return a+b;
}
short TestRet(double a,double b)
{
return a+b;
}
上面的例子中,引數列表完全相同,但是它的返回值型別卻不相同。實際上,以上引數沒有進行函式過載
函式在編譯後的名字修飾問題
int add(int a, int b);
int main()
{
add(1, 2);
return 0;
}
在C語言的環境下進行編譯,它的命名規則是 _ + 函式名字
在Vs 2013 C++的環境下進行編譯,它的命名規則是 看似的雜亂的序列。
分析 :
首先是以 ? 號開始 + 函式的名字 + @ 表明函式的名字
接著以 YA開始 + H (表明整形) + H(表明第一個引數的型別) +H(表明第二個引數的型別) + @ 此段表明函式引數列表的內容
最後 以 Z表明這個函式的丁一結束
如果要想在C++編譯環境中使用 C語言風格編譯 只需要在函式前加入
extern "C" int Add(int a,int b)
引用 &
怎麼使用引用 & 符號?
首先在C語言當中寫一個交換程式。
void Swap(int left, int right)
{
int temp = left;
left = right;
right = temp;
}
這種傳值呼叫沒有函式的副作用,不會影響外部的實參,也就是說無法通過形參的改變,來改變外部的實參。
void Swap(int *left,int *right)
{
if( left == NULL && right == NULL)
{
exit(0);
}
int temp = *left;
*left = *right;
*right = temp;
}
這種函式的副作用明顯,函式使用前必須先驗空。但是能夠達到通過改變形參來影響實參。
這個時候C++提供了一種方便的概念,即引用 &。引用的大體意思就是給引數變數起一個別名。
void Add(int &right,int &left)
{
int temp = right;
right = left;
left = temp;
}
應用變數不會開闢動態記憶體空間。 因為它是已存在的變數的別名。
int main()
{
int a = 10;
int &ra = a;
return 0;
}
引用的特性:
1.引用在定義時必須初始化
2.一個變數可以有多個引用
3.引用一但被定義就不能再次引用了
引用的常屬性帶來的麻煩
const型別的變數常引用分析
int main()
{
const int a = 10;
//1. int &ra = a; 錯誤的做法,如果a具有常屬性,那麼它的引用也必須有常屬性
const int &ra = a;
//2. int &b = 10; 10是一個立即數,它具有常屬性。那麼它的引用也必須有常屬性
const int &b = 10;
//3.double d = 12.34;
// int &rd = d;
//編譯不通過,變數的型別不同,可能會造成資料丟失。
double d = 12.34;
const int &rd = d;
return 0;
}
對於3,出現問題的原因是,double 型別的資料被引用了int 的別名。會造成小數部分的捨去,但是 int &rd是錯誤的。說明double 型別的資料建立了新的空間。並且這個空間是具有常屬性的。
引用變數作為返回值出現隨機值得情況
以下程式碼的輸出結果是 10 ,隨機值,隨機值。
#include<iostream>
using namespace std;
int& TestRef()
{
int ret = 10;
return ret;
}
int main()
{
int &a = TestRef();
printf(" %d \n", a);
printf(" %d \n", a);
printf(" %d \n", a);
return 0;
}
有以下執行過程:
c++中的關鍵字
資料型別:
void int char float double bool w_char
型別定義:
struct union enum class typedef
真值:
true false
型別修飾符:
long short signed unsigned
型別限定符:
const volatile restrict const_case static static_case
儲存說明符:
auto register static extern thread_local mutable
其他修飾符:
inline asm
迴圈控制:
for while do
跳轉控制:
break continue return goto
分支結構:
if else switch case default
記憶體管理:
new delete
訪問限定符:
this friend virtual mutable explicit operator
類訪問修飾符:
private protected public
模板:
template typename
名稱空間:
namespace using
異常處理:
throw try catch