c primer 筆記,第六章

2021-08-10 10:19:54 字數 3707 閱讀 5506

區域性靜態物件使用static宣告,宣告一次後下次再呼叫該函式,則該宣告語句則被忽略

// 練習6.7,第一次被呼叫時返回0,以後每次呼叫返回值加一 

size_t count()

}

當函式無需修改引用形參的值時最好使用常量引用

使用實參初始化形參時會忽略頂層const

使用普通引用會極大地限制函式所能接受的實參型別,我們不能把const 物件、字面值或者需要型別轉換的物件傳遞給普通的引用形參

// 由於該形參為非常量引用,若定義乙個const string或者字面值常量,則無法呼叫該函式 

bool is_empty(string &s)

如果所有實參型別相同,可以傳遞乙個名為initializer_list的標準庫型別用來實現可以處理不同數量實參的函式,型別定義在同名頭檔案中

(1)與vector一樣,該型別也是一種模板型別,但其物件中的元素永遠是常量值,我們無法改變initializer_list物件中元素的值;

(2)拷貝或賦值乙個initializer_list物件不會拷貝列表中的元素;拷貝後,原始列表與副本共享元素(因為該物件中的元素不可能被改變,所以在賦值或拷貝的行為中完全可以與原始列表共享而不用擔心其他任何問題,並且還避免了拷貝的開銷);

(3)lst.size(), lst.begin(), lst.end();

(4)如果想向initializer_list形參中傳遞乙個值的序列,則必須把序列放在一對花括號中;

// 練習6.27 

templateint

sum(initializer_listlst)

int main()

) << endl; //實參必須放在一對花括號中

cout << sum() << endl;

return

0;}

return語句有兩種形式,一種是空return,即 return,另一種是返回乙個表示式,即return expression ;乙個返回型別是void的函式也能使用return 語句的第二種形式,不過此時 return 語句的 expression 必須是另乙個返回void的函式呼叫運算子的優先順序與點運算子和箭頭運算子相同,並且也符合左結合率,如果函式返回指標、引用或類的物件,我們就可以使用函式呼叫的結果訪問結果物件的成員

c++11新標準規定,函式可以返回花括號包圍的值的列表,如果函式返回的是內建型別,則花括號包圍的列表最多包含乙個值,如果函式返回的是類型別,由類本身定義初始值如何使用

#include 

#include

using

namespace

std;

//例:該函式返回值為vector型別

vector

process();}

int main()

關於返回陣列指標:

typedef

int arrt[10]; //arrt是乙個型別別名,它表示的型別是含有10個整數的陣列

using arrt = int[10]; // 等價於上面的宣告

arrt* func(int i); // func返回乙個指向含有10個整數的陣列的指標

int (*fun(int i)) [10];

(1)func(int i)表示呼叫func函式時需要乙個int型的實參;

(2)(*func(int i))意味著我們可以對函式呼叫的結果執行解引用操作;

(3)(*func(int i)) [10]表示解引用func的呼叫將得到喲個大小是10的陣列;

(4)int (*fun(int i)) [10]表示陣列中的元素是int型

尾置型別返回,在本該出現返回型別的地方放置乙個auto, 例如:auto func(int i) -> int(*0[10];

關於函式過載:

(1)過載函式中不允許兩個函式除了返回型別不同其他型別都相同,即意味著返回型別不能用來區別函式

int

func(int i);

bool

func(int i); // 錯誤:遇上乙個函式相比只有返回型別不同

(2)擁有頂層const的形參無法和無頂層const的形參區別開來;

int

func(int );

intfunc(int* const); // 錯誤:重複宣告了func

(3)如果形參是某種型別的指標或引用,則可以通過區分其指向的是常量物件還是非常量物件可以實現函式過載,此時的cons是底層的

int

func(int& );

intfunc(const

int&); // 作用於常量引用

const_cast再函式過載中的作用,如果乙個函式的形參為const版本,返回值為const&的型別,此時若想用非常量實參使用該函式,並得到乙個普通的引用,可以使用const_cast先將非常量實參轉換為常量引用,呼叫const版本函式,然後對返回結果再用const_cast轉換為普通引用,保障整個過程的安全

一旦乙個形參被賦予了預設值,則它後面的所有實參都必須有預設值,在給定的作用於中乙個形參只能被賦予一次預設值,後續的函式宣告只能為沒有預設值的形參新增預設實參

string func(a,b,char = ' ');

string func(a,b,char = '*'); //錯誤,重複宣告

string func(a = 5, b = 8, char); // 正確,在此之前char已經有預設值

constexpr函式的返回值及所有形參型別都得是字面值型別(在編譯時就得到計算,算數型別、引用和指標都屬於字面值型別,自定義類,io庫、string型別都不屬於字面值型別),而且函式體中有且只有一條return語句 ;為了嗯那個在編譯期間隨時展開,constexpr函式被隱式地指定為內聯函式,我們允許constexpr函式返回值並非乙個常量(返回結果可以是乙個常量表示式);

assert的行為依賴於乙個名為ndebug的預處理變數的狀態,如果定義了ndebug,則assert什麼也不做,預設狀態下沒有定義ndebug ;

預處理器定義的5個名字 (標頭檔案為cstdio)

(1)_ _fun_ _:當前除錯的函式的名字;

(2)_ _file_ _ :存放檔名的字串字面值;

(3)_ _line_ _:當前行號;

(4)_ _time_ _:檔案編譯時間;

(5)_ _date_ _:檔案編譯日期;

可以直接使用和i資訊那個函式的指標呼叫該函式,無需提前解引用指標

// func函式返回乙個函式指標,該函式指標所指的函式的形參為乙個int* 和乙個 int,返回值為int 

int (*func(int)) (int*, int);

// 等價於

using pf = int(*)(int*, int);

pf func(int);

// 等價於

auto func(int) -> int (*)(int*, int);

c primer 筆記 第六章 函式

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

C primer 第六章筆記 初稿

用指標來傳遞多維陣列時,仍然需要傳遞二維的具體引數 可變形參 個人感覺就是乙個容器?如下class class1 private int a int b class class2 private int a int b int main class2 c2 1,2 return 0 莫名把賦值與判斷...

C Primer 筆記 第六章 函式

函式的呼叫完成兩項工作 一是用實參初始化形參,二是將控制權轉移給被呼叫函式。函式最外層作用域中的區域性變數也不能使用與函式形參一樣的名字。形參和函式體內定義的變數都是區域性變數。普通的區域性變數只存在於其定義所在塊的執行時間內,內建型別的未初始化的區域性變數將產生未定義的值。區域性變數在程式第一次經...