函數(shù)是一組一起執(zhí)行一個(gè)任務(wù)的語句。每個(gè) C++ 程序都至少有一個(gè)函數(shù),即主函數(shù) main() ,所有簡單的程序都可以定義其他額外的函數(shù)。
創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元從江做網(wǎng)站,已為上家服務(wù),為從江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792你可以把代碼劃分到不同的函數(shù)中。如何劃分代碼到不同的函數(shù)中是由你來決定的,但在邏輯上,劃分通常是根據(jù)每個(gè)函數(shù)執(zhí)行一個(gè)特定的任務(wù)來進(jìn)行的。
函數(shù)聲明告訴編譯器函數(shù)的名稱、返回類型和參數(shù)。函數(shù)定義提供了函數(shù)的實(shí)際主體。
C++ 標(biāo)準(zhǔn)庫提供了大量的程序可以調(diào)用的內(nèi)置函數(shù)。例如,函數(shù) strcat() 用來連接兩個(gè)字符串,函數(shù) memcpy() 用來復(fù)制內(nèi)存到另一個(gè)位置。
函數(shù)還有很多叫法,比如方法、子例程或程序,等等。
在相同的作用域,可以定義同名的函數(shù),但是它們的參數(shù)要有所區(qū)分,這樣的函數(shù)構(gòu)成重載關(guān)系,此外函數(shù)之間能否構(gòu)成重載和返回值無關(guān)。
小例子:
#include
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;
}
返回結(jié)果:
foo(int)
foo(int, int)
C++編譯是通過對函數(shù)進(jìn)行換名,將參數(shù)表的信息整合到新的函數(shù)名中,解決函數(shù)重載與名字沖突的矛盾。
通過nm查看目標(biāo)文件中函數(shù)換名后的名字:
源文件的內(nèi)容:
void func(int a, int b) {}
void func(int a, int b, int c) {}
生成目標(biāo)文件:
F:\c_projects\20181011_01>g++ -c demo3.cpp
查看目標(biāo)文件信息:
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 // 修改后的第一個(gè)函數(shù)
00000006 T __Z4funciii // 修改后的第二個(gè)函數(shù)
當(dāng)你打算讓你的C程序去調(diào)用C++的程序的時(shí)候,是無法直接去函數(shù)的,因?yàn)镃++的編譯器會將函數(shù)修改名字,當(dāng)然若是直接調(diào)用C++編譯器修改后的名字也是可以的。
也可以在函數(shù)聲明的時(shí)候加入extern "C",這樣是要求C++編譯器不對函數(shù)做換名,便于C程序去調(diào)用,但是這樣的函數(shù)無法實(shí)現(xiàn)重載。
實(shí)例:
extern "C" void func(..){..}
extern "C" {
void func1(..){..}
void func2(..){..}
...
}
可以為函數(shù)的部分或全部形參指定缺省值,調(diào)用該函數(shù)時(shí),如果不給實(shí)參,就取缺省值作為相應(yīng)形參的值。
例如:
#include
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(); // 當(dāng)沒有給函數(shù)傳遞參數(shù)的時(shí)候,函數(shù)的參數(shù)取的是默認(rèn)給的值
return 0;
}
結(jié)果是:
a = 1
b = 2
c = 3
缺省參數(shù)必須靠右,如果一個(gè)參數(shù)帶有缺省值,那么右側(cè)的所有參數(shù)都必須帶有缺省值。
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
如果函數(shù)的定義和聲明分開,缺省參數(shù)應(yīng)該寫在函數(shù)的聲明部分,而定義部分不寫。
聲明:
void func(int a, int b = 100, int c = 200);
定義:
void func(int a, int b, int c) {};
void func(){函數(shù)體}//函數(shù)定義
void func();//函數(shù)聲明
只有類型沒有變量名的形參稱為啞元參數(shù)。
例如:
void func(int){};
啞元參數(shù)因?yàn)闆]有變量名因此是不需要也不能被調(diào)用的。
一般在兼容舊代碼的時(shí)候會用到。
實(shí)例:
#include
using namespace std;
void func(int a, int) {
cout << "啞元參數(shù)" << endl;
}
int main() {
func(10, 20);
return 0;
}
使用inline關(guān)鍵字修飾的函數(shù),表示這個(gè)函數(shù)是內(nèi)聯(lián)函數(shù),編譯器將會嘗試做內(nèi)聯(lián)優(yōu)化,避免函數(shù)調(diào)用的開銷。
實(shí)例:
inline void func(...) {};
內(nèi)聯(lián)函數(shù)僅適用于小而簡單的函數(shù),調(diào)用次數(shù)很少或者大而復(fù)雜的函數(shù),不適合做內(nèi)聯(lián),例如遞歸函數(shù)。
此外內(nèi)聯(lián)優(yōu)化知識一種建議而不是要求,能否內(nèi)聯(lián)主要取決于編譯器,有些函數(shù)不加inline關(guān)鍵字也會進(jìn)行內(nèi)聯(lián)優(yōu)化,而有些函數(shù)即便加了inline關(guān)鍵字也會被編譯器忽略。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。