C primer第五版筆記 第六章函式

2021-07-05 13:53:34 字數 4363 閱讀 6514

1、區域性靜態物件

將物件宣告成static的作用是在程式的執行路徑第一次經過物件定義語句時初始化它,並且直到程式終止才銷毀。在此期間即使物件所在的函式結束執行也不會對他有影響。

#include using namespace std;

size_t cout_calls()

int main()

system("pause");

return 0;

}

2、引數傳遞

2.1、傳值引數

指標形參:當執行指標拷貝操作時,拷貝的是指標的值。拷貝之後兩個指標是不同的指標。因為指標使我們可以簡介的訪問它所指的物件。所以通過指標可以修改它所指物件的值。

void reset(int *ip) 

int main()

2.2、傳引用引數

void reset(int &ip) 

int main()

注意:如果型別較大,應該使用引用避免拷貝;如果函式無需改變引用形參的值,最好將其宣告為常量引用

bool isshorter(const string &s1, const string &s2)

返回額外資訊

//size_type 與機器無關,而int與機器有關

string::size_type find_char(const string &s, char c, string::size_type &occurs)

} return ret;

}

const

形參和實參

const int ci = 42;//不能改變ci,const是頂層的

int i = ci; //正確,當拷貝ci時,忽略了他頂層的ci

int * const p = & i;//const是頂層的,不能給p賦值

*p = 0; //正確,通過p改變物件的內容是允許的,現在i變成了0

盡量使用常量引用

//不良設計,第乙個形參型別應該是const string&

string::size_type find_char(const string &s, char c, string::size_type &occurs)

} return ret;

}bool is_sentences(const string &s)

陣列形參:不允許拷貝陣列;使用陣列時將其轉換為指標

//以下三個等價

void print(const int*);

void print(const int);

void print(const int[10]); //這裡維度表示我們期望含有多少個元素,實際不一定

int main() ;

print(&i); //正確,&i的型別是int *

print(j); //正確,j轉換成int *並指向j[0]

system("pause");

return 0;

}//使用標準庫規範

void print(const int *beg,const int *end)

cout << endl;

}//顯示傳遞乙個陣列大小的形參,其中,const int ia等價於const int* ia

void print(const int ia, size_t size)

cout << endl;

}void print(int(&arr)[10])

cout << endl;

}int main() ;

print(begin(j),end(j));

int a = ;

print(a,end(a)-begin(a));

int b = ;

print(b);

system("pause");

return 0;

}

含有可變形參的函式

3、返回值和

return

語句

//如果ctr的值大於1,返回word的複數形式

string make_plusral(size_t ctr, const string &word, const string &ending)

//挑出兩個string物件中較短的那個,返回其引用

const string &shorterstring(const string &s1, const string &s2)

引用返回左值

char &get_val(string &str, string::size_type ix)

int main() ;

int even = ;

decltype(odd) *arrptr(int i)

4、函式過載

過載函式:

1、形參數量和形參型別上有所不同;

2、不允許兩個函式除了返回型別外其他所有要素都相同。

乙個擁有頂層

const

的形參無法和另乙個沒有頂層

const

的形參區分開

recorde lookup(phone);

recorde lookup(const phone);//重複宣告

另一方面,如果形參是某種型別的指標或引用,則通過區別其指向的是常量物件還是非常量物件可以實現函式的過載,此時

const

是底層的

recorde lookup(account &)      //函式作用於acoount的引用

recorde lookup(const account &)//新函式,作用於常量引用

const string &shorterstring(const string &s1, const string &s2) 

string &shorterstring(string &s1, string &s2)

5、特殊用途語言特性 1

、呼叫函式一般比直接求等價表示式的值要慢一些,在大多數機器上,一次函式呼叫其實包含一系列工作:呼叫前先儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置繼續執行。 2

、除錯幫助

assert

預處理:

assert

(expr):

首先對expr

求值,如果表示式為假,

assert

輸出資訊並終止程式的執行。如果為真,則什麼也不做。

assert

行為依賴於

ndebug

,如果定義了

ndebug

,則assert

什麼也不做。

__file__

存放檔名的字串字面值

__line__

存放當前行號的整形字面值

__time__

存放檔案編譯時間的字串字面值

__date__

存放檔案便日期的字串字面值 3

、函式匹配

函式匹配的第一步是選定本次呼叫對應的過載函式集,集合中的函式稱為候選函式;

第二步考察本次呼叫提供的實參,然後從候選函式中選出能被這組實參呼叫的函式,這些函式稱為可行函式。 6

、函式指標 1

、 //比較兩個

string

物件的長度

boollengthcompare(const string &, const string &);

該函式的型別是

bool(const string &, const string &),

要想宣告乙個可以指向該函式的指標,只需要用指標替換掉函式名即可

bool(*pf)(const string &, const string&);//

未初始化

使用函式指標:當我們把函式名作為乙個值使用時,該函式自動轉換為指標。

pf = lengthcompare;//pf

指向名為

lengthcompare

的函式

pf = &lengthcompare;//

等值語句,

&是可選的

此外還可以直接使用

boolb1 = pf("hello","goodbye");

C Primer第五版 第六章 函式

6.1 實參是形參的初始值,形參在函式呼叫完後就被釋放了,兩者的生命週期不同。6.81 ifndef chapter6 h 2 define chapter6 h 3int fact int 456 endif 6.9 併排開啟三個檔案 vim o 6.8.h 6.8.cpp 6.8 1.cpp 1...

C primer 第五版個人筆記 第六章 函式

通過呼叫運算子 call operator 來執行函式。呼叫運算子的形式是一懟圓括號 它作用於乙個表示式,該表示式是函式或者指向函式的指標 呼叫表示式的型別就是函式的返回型別。int function 是乙個呼叫表示式,是用呼叫運算子 作用於函式名function 實際上是指標 int型別為呼叫表示...

c primer 筆記,第六章

區域性靜態物件使用static宣告,宣告一次後下次再呼叫該函式,則該宣告語句則被忽略 練習6.7,第一次被呼叫時返回0,以後每次呼叫返回值加一 size t count 當函式無需修改引用形參的值時最好使用常量引用 使用實參初始化形參時會忽略頂層const 使用普通引用會極大地限制函式所能接受的實參...