C++中的函式及引數介紹
函式的概念
函式是一組一起執行一個任務的語句。每個 C++ 程式都至少有一個函式,即主函式 main() ,所有簡單的程式都可以定義其他額外的函式。
你可以把程式碼劃分到不同的函式中。如何劃分程式碼到不同的函式中是由你來決定的,但在邏輯上,劃分通常是根據每個函式執行一個特定的任務來進行的。
函式宣告告訴編譯器函式的名稱、返回型別和引數。函式定義提供了函式的實際主體。
C++ 標準庫提供了大量的程式可以呼叫的內建函式。例如,函式 strcat() 用來連線兩個字串,函式 memcpy() 用來複制記憶體到另一個位置。
函式還有很多叫法,比如方法、子例程或程式,等等。
函式過載
簡單介紹
在相同的作用域,可以定義同名的函式,但是它們的引數要有所區分,這樣的函式構成過載關係,此外函式之間能否構成過載和返回值無關。
小例子:
#include <iostream>
using namespace std;
void foo(int a) {
cout << "foo(int)" << endl;
}
void foo(int a, int b) {
cout << "foo(int, int)" << endl;
}
int main() {
foo(1);
foo(2, 3);
return 0;
}
返回結果:
foo(int)
foo(int, int)
函式過載的原理
C++編譯是通過對函式進行換名,將引數表的資訊整合到新的函式名中,解決函式過載與名字衝突的矛盾。
通過nm檢視目標檔案中函式換名後的名字:
原始檔的內容:
void func(int a, int b) {}
void func(int a, int b, int c) {}
生成目標檔案:
F:\c_projects\20181011_01>g++ -c demo3.cpp
檢視目標檔案資訊:
F:\c_projects\20181011_01>nm demo3.o
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T __Z4funcii // 修改後的第一個函式
00000006 T __Z4funciii // 修改後的第二個函式
當你打算讓你的C程式去呼叫C++的程式的時候,是無法直接去函式的,因為C++的編譯器會將函式修改名字,當然若是直接呼叫C++編譯器修改後的名字也是可以的。
也可以在函式宣告的時候加入extern "C",這樣是要求C++編譯器不對函式做換名,便於C程式去呼叫,但是這樣的函式無法實現過載。
例項:
extern "C" void func(..){..}
extern "C" {
void func1(..){..}
void func2(..){..}
...
}
函式的引數
預設引數
可以為函式的部分或全部形參指定預設值,呼叫該函式時,如果不給實參,就取預設值作為相應形參的值。
例如:
#include <iostream>
using namespace std;
void func(int a = 1, int b = 2, int c = 3) {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main() {
func(); // 當沒有給函式傳遞引數的時候,函式的引數取的是預設給的值
return 0;
}
結果是:
a = 1
b = 2
c = 3
預設引數必須靠右,如果一個引數帶有預設值,那麼右側的所有引數都必須帶有預設值。
void func(int a = 10, int b = 20);//ok
void func(int a, int b = 20);//ok
void func(int a = 10, int b);//error
如果函式的定義和宣告分開,預設引數應該寫在函式的宣告部分,而定義部分不寫。
宣告:
void func(int a, int b = 100, int c = 200);
定義:
void func(int a, int b, int c) {};
void func(){函式體}//函式定義
void func();//函式宣告
啞元引數
只有型別沒有變數名的形參稱為啞元引數。
例如:
void func(int){};
啞元引數因為沒有變數名因此是不需要也不能被呼叫的。
一般在相容舊程式碼的時候會用到。
例項:
#include <iostream>
using namespace std;
void func(int a, int) {
cout << "啞元引數\nLinux公社www.linuxidc.com" << endl;
}
int main() {
func(10, 20);
return 0;
}
行內函數
使用inline關鍵字修飾的函式,表示這個函式是行內函數,編譯器將會嘗試做內聯優化,避免函式呼叫的開銷。
例項:
inline void func(...) {};
行內函數僅適用於小而簡單的函式,呼叫次數很少或者大而複雜的函式,不適合做內聯,例如遞迴函式。
此外內聯優化知識一種建議而不是要求,能否內聯主要取決於編譯器,有些函式不加inline關鍵字也會進行內聯優化,而有些函式即便加了inline關鍵字也會被編譯器忽略。
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-10/155060.htm