C和C++的區別第一部分
阿新 • • 發佈:2018-12-22
1.C++可以給函式預設值
C++在定義時可以給函式預設值
1.int sum(int a,int b=10)
{
return a+b;
}
在呼叫sum 函式時不給引數b的值系統會預設b的值為10;
2.C++在給函式預設值時是從左至右如
int sum(int a=1,int b,int c)
int sum(int a=1,int b,int c)
是錯的。因為系統會產生二義性不知道該給哪個引數賦值。
1.行內函數inline
c++的行內函數是在編譯時 在呼叫點把行內函數的程式碼展開在呼叫點處,並不會產生函式符號
類如:
Inline Int sum (int a,int b)
{return a+b;}
Main()
{
Int x=10;
Int y=20;
Sum(x,y);
}
編譯時就是
Main()
{
Int x=10;
Int y=20;
x+y;
}
並不會給sum函式開闢個新棧,而是直接的程式碼替換。
看起來行內函數和巨集很相像,那他們的區別在哪?
區別就是 巨集是單純的字元替換,在預編譯的階段,不會做任何的詞法解析,型別檢查,也就是說巨集出錯的可能性非常高,不安全。而inline內斂函式是在編譯時期,會進行詞法解析,型別檢查,詞法、型別有誤就會編譯失敗。所以說,inline相當於安全版的巨集。
行內函數只在本檔案可見。
最後值得注意的是內斂函式只算一個給編譯器的建議,也就是說編譯器可能不會使用內斂,因為某些函式使用程式碼替換會導致錯誤,比如遞迴函式,遞迴的核心就是開闢棧幀遞迴資料然後層層計算最後收尾,簡單的程式碼替換確定不了遞迴的尾巴?
3.函式的過載
c語言中函式名不能重複定義。
C++中函式的命名可以重複,但重名的函式提供的引數不能相同。因為C++的函式符號的產生是由函式名和引數型別決定的。
函式的過載必須得在同一個作用域內。