函數(shù)基礎(chǔ)
- 函數(shù)包括:返回類型市殷、函數(shù)名字、0個(gè)或多個(gè)形參組成的列表
形參和實(shí)參
- 實(shí)參是形參的初始值
局部靜態(tài)對(duì)象
在程序的執(zhí)行路徑的第一經(jīng)過對(duì)象的語(yǔ)句時(shí)初始化刹衫,并且直到程序終止才被取消醋寝。在此期間即使對(duì)象所在的函數(shù)結(jié)束執(zhí)行也不會(huì)對(duì)它有影響。
#include <iostream>
size_t count_calls()
{
static size_t ctr = 0;//調(diào)用結(jié)束后這個(gè)值仍有效带迟,只初始化一次
return ctr++;
}
int main()
{
std::cout << "Hello World!\n";
for (size_t i = 0; i != 10; i++)
{
std::cout << count_calls() << std::endl;
}
}
參數(shù)傳遞
- 引用傳遞:形參綁定到對(duì)應(yīng)的實(shí)參上
- 值傳遞:實(shí)參的值拷貝到形參上音羞,兩者相互獨(dú)立
最好用引用傳遞,值傳遞往往低效仓犬。如果無(wú)需修改形參的值嗅绰,最好用const引用
引用形參返回額外的信息
一直以來我都是用自定義數(shù)據(jù)類型來返回的。。窘面。翠语。。民镜。(愚蠢)
-
有一種非常簡(jiǎn)單的方法啡专,多給函數(shù)傳入一個(gè)額外的實(shí)參引用!制圈!
#include <iostream>
bool count_calls(const int & a, int& b)
{
if (a % 2 == 0)
{
b = 1;
return 1;
}
else
{
b = 0;
return 0;
}
}
int main()
{
int b = 0;
int a = 0;
if (count_calls(a, b))
{
std::cout << b;
}
}
const 形參和實(shí)參
- 當(dāng)實(shí)參初始化形參時(shí)會(huì)忽略掉頂層const,當(dāng)形參有const時(shí)畔况,傳給它常量或者非常量都是可以的
const int ci=42;//不能改變Ci,const是頂層的
int i=ci;//正確:當(dāng)拷貝ci時(shí)鲸鹦,忽略了它的頂層const
int *const p=&i;//const是頂層的,不能給p賦值
*p=0;//正確:通過p改變對(duì)象的內(nèi)容是允許的跷跪,現(xiàn)在i變成了0
void fcn(const int i)
{
'''
fcn能讀取i馋嗜,但是不能向i寫值
'''
}
指針或引用形參與const
直接上例程
int i=42;
const int *cp = &i;//正確:但是cp不能改變i
const int &r=i;//正確:但是r不能改變i
const int &r2=42;//正確
int *p=cp;//錯(cuò)誤:p的類型和cp的類型不匹配
int &r3=r;//錯(cuò)誤:r3的類型和r的類型不匹配
int &r4=42;//錯(cuò)誤:不能用字面值初始化一個(gè)非常量引用
應(yīng)用到參數(shù)傳遞上如下
int i=0;
const int ci=i;
string::size_type ctr=0;
reset(&i);//調(diào)用形參類型是int*的reset函數(shù)
reset(&ci);//錯(cuò)誤:不能用指向const int 對(duì)象的指針初始化int*
reset(i);//調(diào)用形參類型是int&的reset函數(shù)
reset(ci);//錯(cuò)誤:不能把普通引用綁定到const對(duì)象ci上
reset(42);//錯(cuò)誤:不能把普通應(yīng)用綁定到字面值上
reset(ctr);//錯(cuò)誤:類型不匹配,ctr是無(wú)符號(hào)類型
find_char("Hello World!",'o',ctr);//正確:find_char的第一形參是對(duì)常量的引用
盡量用常量引用
舉個(gè)栗子~~~
string::size_type find_char(string &s,char c,string::size_type &occurs);
find_char ("hello World",'o',ctr);//錯(cuò)誤吵瞻,string &s 無(wú)法引用字面初始值
參考:C++primer 第五版