標籤:傳回值 定義 size 分配 調用次數 foo logs ref 操作符
六 C++的布爾類型1 bool類型是C++中基本類型,專門表示邏輯值:true/false2 bool在記憶體上佔一個位元組:1表示true,0表示false3 bool類型可以接收任意類型和運算式的結果,其值非0則為true,值為0則為false七 操作符別名(瞭解)&& --》 and|| --》 or{ --》 <%} --》 %>...八 C++函數1 函數重載strcpy(char*,const char*)strcpy(char*,const char*,int)1)定義 在相同的範圍,定義同名的函數,但是它們的參數表必須有所區分,這樣的函數構成重載關係。 註:重載和返回傳回型別無關2)函數重載匹配 調用重載關係函數函數,編譯器根據實參與形參匹配程度,自動選擇最優的重載版本。 當前編譯器的匹配原則 g++ V4.8.1: 完全符合>常量轉換>升級轉換>降級轉換>省略符號匹配3)函數重載原理 C++編譯器通過函數換名,將參數表的資訊整合到新的函數名中,實現解決函數重載與名字衝突的矛盾eg: 代碼裡面寫的函數: void func(int i,double d); void func(int i); 編譯之後函數名將改變: func(int,double)-->_Z4funcid func(int)-->_Z4funci 筆試題:函式宣告中加入extern "C"作用? 要求C++編譯器不會函數做換名,便於C程式調用該函數。 文法: extern "C" void func(..){..} ---------------------------- extern "C"{ void func1(){} void func2(){} }-------2 函數的預設參數(預設實參)1)可以為函數的部分參數和全部參數指定預設值,調用該函數,如果不給實參,就取預設值作為相應的形參值。eg: void func(int a,int b,int flag=0){..} int main(void){ func(10,20,1); func(10,20); }2)預設參數必須靠右,如果一個參數有預設值,那麼這個參數的右側所有參數都必須帶有預設值。3)如果函數的定義和聲明分開,預設參數應該寫在函數的聲明部分,而定義部分不寫。void func(){..} -->函數的定義void func(); -->函數的聲明3 函數的啞元參數1)定義:只有類型而沒有變數名的形參稱為啞元eg: void func(int a,int/*啞元*/){}2)使用啞元的情境--》為了相容舊代碼演算法庫: void math_func(int a,int b){...}使用者: int main(void){ math_func(10,20); ... math_func(20,30); }------------------------------------升級演算法庫: void math_func(int a,int=0){...}--》操作符重載時,區分前後++/--(後面講)4 內嵌函式(inline)//筆試題:inline關鍵字的作用1)定義 使用inline關鍵修飾的函數,表示這個函數是內嵌函式,編譯器將嘗試做內聯最佳化,避免函數調用的開銷,提高代碼的執行的效率。2)適用情境--》多次調用的小而簡單的函數適合內聯--》調用次數極少擷取大而複雜的函數不適合內聯--》遞迴函式不適合內聯註:內聯只是一種建議而不是強制要求,能否內聯主要取決於編譯器,有些函數不加inline關鍵字修改也會被預設處理為內聯,有些函數即便加了inline關鍵字也會被編譯器忽略。---------------------筆試題:1)程式碼片段1for(int i=0;i<100000;i++) for(int j=0;j<100;j++) ... 2)程式碼片段2for(int i=0;i<100;i++) for(int j=0;j<100000;j++) ...---------------------九 C++的動態記憶體分配//筆試題:C++中new/delete和C中malloc和free區別1 回顧C中動態分配1)分配:malloc()2)釋放:free()3)錯誤:傳回值eg: int* p = (int*)malloc(sizeof(int)); *p = 100; free(p);//避免泄露 p = NULL;//避免使用野指標2 C++使用運算子分配動態記憶體1)分配:new、new[]2)釋放:delete、delete[]3)錯誤處理:異常(後面講)eg: //int* p = new int;//分配不初始化 //*p = 100; int* p = new int(100);//分配同時初始化 delete p; p = NULL; ----------------- int* parr = new int[10];//分配數組 parr[0]=10; parr[1]=20; ... delete[] parr; parr = NULL;--------------------------十 C++的引用(Reference)1 定義1)引用就是某個變數的別名,對引用的操作與對該變數的操作完全相同。2)文法規則 類型& 引用名 = 變數名; 註:引用在定義時必須初始化,而且初始化以後不能修改引用的目標。 註:參考型別和它所綁定的目標變數類型要一致 eg: int a = 10; int& b = a;//b就是a的別名 b++; cout << a << endl;//11 int c = 20; b = c;//將c的值賦值給b(a) cout << a << endl;//20 2 常引用1)定義引用時加const修飾,即為常引用,不能通過常引用修改引用的目標。 const 類型& 引用名 = 變數名;eg: int a = 10; const int& b = a;//b就是a的常引用 b = 200;//error2)普通的引用只能引用左值,而常引用也叫做萬能引用,既能引用左值,也能引用右值。==================註:關於左值和右值1)左值:可以放在賦值運算子的左側-->普通變數都是左值-->前++/--運算式結果是左值-->賦值運算式的結果是左值eg: int a = 1; ++a = 20;//ok cout << a << endl;//20 ++++++a; cout << a << endl;//23eg: int a = 3,b = 5; int c = 0; (c = a) = b;//ok cout << c << endl;//52)右值:只能放在賦值運算子右側--》字面值常量--》大多數運算式的值eg: int a = 3,b = 5; (a + b) = 10;//error,a+b的結果是右值 --》函數傳回值eg: int foo(void){ int a = 100; return a;//分配臨時變數=a } int main(void) { int res = foo();//函數調用結果是臨時變數 cout << res << endl;//100 int& r = foo();//error const int& cr = foo(); return 0; }
布爾類型、操作符別名、C++函數、動態記憶體分配(new\delete)、引用(day02)