布爾類型、操作符別名、C++函數、動態內存分配(newdelete)、引用(day02)
阿新 • • 發佈:2017-10-25
color 返回 void double 強制 也會 了解 關系 指針
六 C++的布爾類型 1 bool類型是C++中基本類型,專門表示邏輯值:true/false 2 bool在內存上占一個字節:1表示true,0表示false 3 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)代碼片段1 for(int i=0;i<100000;i++) for(int j=0;j<100;j++) ... 2)代碼片段2 for(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;//error 2)普通的引用只能引用左值,而常引用也叫做萬能引用,既能引用左值,也能引用右值。 ================== 註:關於左值和右值 1)左值:可以放在賦值運算符的左側 -->普通變量都是左值 -->前++/--表達式結果是左值 -->賦值表達式的結果是左值 eg: int a = 1; ++a = 20;//ok cout << a << endl;//20 ++++++a; cout << a << endl;//23 eg: int a = 3,b = 5; int c = 0; (c = a) = b;//ok cout << c << endl;//5 2)右值:只能放在賦值運算符右側 --》字面值常量 --》大多數表達式的值 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)