您好,登錄后才能下訂單哦!
函數是一組一起執行一個任務的語句。每個 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 << "啞元參數" << endl;
}
int main() {
func(10, 20);
return 0;
}
使用inline關鍵字修飾的函數,表示這個函數是內聯函數,編譯器將會嘗試做內聯優化,避免函數調用的開銷。
實例:
inline void func(...) {};
內聯函數僅適用于小而簡單的函數,調用次數很少或者大而復雜的函數,不適合做內聯,例如遞歸函數。
此外內聯優化知識一種建議而不是要求,能否內聯主要取決于編譯器,有些函數不加inline關鍵字也會進行內聯優化,而有些函數即便加了inline關鍵字也會被編譯器忽略。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。