C primer之第六章 函式2

2021-08-16 18:50:32 字數 4226 閱讀 6828

知識點:

1.盡量使用常引用,而把函式不會改變的形參定義成引用是一種比較常見的錯誤,

我們不能把const物件, 字元值,或者需要型別轉換的物件傳遞給普通的引用形參。

2.陣列的兩個性質:1不允許拷貝陣列;2使用陣列時會將其轉換成指標。

3 .陣列是以指標的形式傳遞給函式的,所以一開始函式並不知道陣列的確切尺寸,呼叫者應該為此提供一些額外的資訊。一般有三種方法:

a一般常見於c風格字串,函式處理到最後乙個空字串時停止。但是有時對於int這樣所有的取值都是合法值的資料就不太有效。

b第二種傳遞指向陣列首元素的尾元素的指標 如:

void print(

const int *beg,

const int *end)。當不需要對陣列元素執行寫操作的時候,陣列形參應該是指向const的指標,只有當函式確實要改變元素值的時候,才把形參定義成指向非常量的指標。

c第三種管理陣列實參的方法是在傳送陣列首位址後,在另外傳乙個形參專門表示陣列大小的形參。

4.請記住,在c ++中沒有陣列型別的值,所以陣列型別不能是函式引數或返回型別。陣列的大小對函式的呼叫沒關係。

5.但是c++語言允許將變數定義成陣列的引用,所以形參也可以是陣列的引用。此時引用形參繫結到對應的實參上,也就是繫結到陣列

上。 6.c++11新標準引入了兩個名為begin和end的函式,這兩個函式與容器中的兩個同名成員功能類似,但不是成員函式,是標準庫函式。(主要用於返回陣列的首尾指標)。

7.當我們需要給main函式傳參時,需要注意到int main(int argc,char*  argv ) 第二個形參是c風格陣列,存放字元命令的位址,數量等於字串的數量(argc)。當實參傳給main函式之後,argv的第乙個元素指向程式的名字或者乙個空字串,接下來的元素依次傳遞命令列提供的實參,

記住最後乙個指標指標之後的元素為0(eg p197)。

8.當使用argv中的實參時,一定要記得可選的實參從argv[1]開始; argv[0]儲存程式的名字, 而非使用者輸入。

9.為了能出列不同數量實參的函式,c++11標準提供了兩種主要的方法,1實參型別相同可以傳遞initializer_list的標註庫型別(模板型別)個人覺得和傳引數組引用很相似;2型別不同可以編寫可變引數模板。還有一種只用於與c函式互動的介面程式省略符形參。

10.return 語句;主要是

終止當前函式的執行,將控制權返還到呼叫該函式的地方。void 函式可以使用兩種return 1是當提前終止函式,加"return;"語句即可; 另一種是return expression; expression必須是另乙個返回void的函式。

11.函式的返回型別決定函式的呼叫是否是左值。

疑問:1. 今天才編寫6.17時,沒弄懂記錄在這裡

環境:vs2010 //剛開始 使用迭代器訪問一直出錯,除錯是錯誤的指標,換成用下標訪問依然有錯。

string word(

"hello everybody"

); fun6_17(word);

void

fun6_17(

const

string &word1)

//因為傳進來的是常量,所以這裡必須加const }

*/ intlen = word1.size();

for(int

i=0; i }

} 好奇怪;去吃中午飯前,有除錯了下這段程式;莫名奇妙的好了;連原因不知道在**

/*6.25及6.26

這個是參考別人的,感覺在ied下不是很好理解,在linux有命令引數下程式設計,會好理解些

int main(int argc, char *argv)

cout<

return 0;

} */

習題:6.16 答:當實參是const物件,字元值等時,會發生錯誤。改為

bool is_empty(const string &s)

618 答:(a)

bool

compare

(const

matrix &m1,

const

matrix &m2);

(b) vector<

int>::iterator

change_val

(int

, vector<

int>::iterator);

6.19 答:(a) 不合法; (b) 合法  (c) 合法 (d) 合法 但有警告;

6.20 答:當傳入是字元面值常量, 或者是用const修飾的字元,或者呼叫者就需要關心傳入的 student 物件有可能會被修改形參一般是常量引用。看編譯器執行標準吧, 如果必須用const而形參沒加肯定會報錯,如果不太需要const,編譯不會報錯。

6.24 答:這段程式是想接受乙個含有10個const int 型別的數, 但是c++編譯器會將帶有型別的統一解釋成指標,所以陣列大小是不相關的,如const int ia[5]與const int ia[255] 沒有 區別。

(關於本節知識點4,5)

void print(const int ia[10])

應該這樣做:

void

print10

(const

int(&ia)[10])

6.28 答:原型:void error_msg(errcode e,   initializer_listil) 因為il是個型別的陣列,所以範圍for語句elem 是string& 型別。範圍for迴圈中auto推導出來的是值,而非迭代器。

6.29 答:看是否追求效率。

程式題:

#include

#include

#include

using

namespace

std;

//判斷string中是否含有大寫字母

void

fun6_17(

const

string &word1)

//因為傳進來的是常量,所以這裡必須加const }

}//將單詞改為小寫

void

fun6_17(string & s)

cout< }

//返回較大的數

intfun6_21(

intin,

int*jn)

void

fun6_22(

int* &pp,

int* &qq) 

//採用引用方便,指標麻煩易出錯

//採用第一種方式訪問陣列內容(訪問到空字串,自動停止)

void

fun6_23print(

char

(&ch1)[6])

//注意這裡的括號

//採用第二種方式,傳送陣列的首尾指標

void

fun6_23print(

const

char

*p,const

char

*q)//因為不牽扯修改陣列內容,建議const修飾 }

//採用第三種方式,傳遞陣列首位址以及陣列元素個數

void

fun6_23print(

char

*p,int

num)

/* while(num)

cout<

*/ }

//採用initializer_list計算傳過來的所有引數的值,vs2010不支援新特性,win7

/* int fun6_27_sum(const std::initializer_list& il)

*///關於編譯器對rentrun 報錯的反應結果:

//「fun6_30str_subrange」: 函式不接受 0 個引數,fun6_30str_subrange」: 函式必須返回值

bool

fun6_30str_subrange(

const

string &str1,

const

string &str2)

} intmain()

; char ch[6] = "hallo";

//fun6_23print(ch);

//fun6_23print(begin(ch),end(ch));//c++ 標準庫函式,返回陣列首尾指標

//fun6_23print(ch, 6);

*/ //fun6_27_sum();

fun6_30str_subrange(

"abc"

,"hallo");

return

0; }

C Primer 第六章 函式

1.實參 argument 是形參 parameter 的初始值。第乙個實參初始化第乙個形參,以此類推 2.c 中,名字有作用域,物件有宣告週期 lifetime 3.形參和函式體內部定義的變數統稱為區域性變數 local variable 4.自動物件 automatic object 只存在於塊...

C Primer 第六章 函式

1.1 區域性變數 1.2 函式宣告 1.3 分離式編譯 2.引數傳遞 2.2 傳引用引數 2.3 const 形參和實參 2.4 陣列形參 2.5 main 處理命令列選項 2.6 含有可變形參的函式 3.返回型別和 return 語句 3.3 返回陣列指標 4.函式過載 4.1 過載和作用域 5...

c primer 筆記 第六章 函式

1.函式的返回型別不能是陣列型別或函式型別,但可以是指向陣列或函式的指標 返回陣列的指標 1 使用型別別名 typedef int arrt 10 using arrt int 10 與上面的宣告等價 arrt func int i 2 直接宣告 int func int i 10 3 使用尾置返回...