標籤:對象 接收 ... rar c++11 理念 角度 而不是 瞭解
十 C++的引用(Reference)1 2 3 引用型函數參數1)將引用用於函數的參數,可以修改實參變數的值,同時也能減小函數調用的開銷。2)引用參數有可能意外修飾實參的值,如果不希望修改實參變數本身,可以將其定義為常引用,提高傳參效率的同時還可以接收常量型的實參。 4 引用型函數傳回值1)可以將函數傳回型別聲明為引用,避免函數傳回值所帶來的開銷。2)一個函數傳回型別被聲明為引用,那麼該函數傳回值可以是一個左值。3)為了避免在函數外部修改引用的目標,可以為該引用附加常屬性。eg: int& foo(void){ static int a = 100; return a; } int main(void) { foo() = 200;//ok }註:不要返回局部變數的引用,因為所引用的目標記憶體會在函數返回以後被釋放,危險!但是可以返回成員變數、靜態變數、全域變數的引用//筆試題:引用和指標的區別...5 引用和指標1)從C語言角度,引用的本質就是指標,但是在C++中推薦使用引用而不是指標。eg: double d = 3.14; double& rd = d; double* const pd = &d; rd <=等價=>*pd2)指標定義可以不做初始化,其目標可以修改(指標常量除外),而引用必須做初始化,而且一旦初始化所引用的目標能再改變。eg: int a=3,b=5; int* p;//ok,可以不初始化 //int& r;//error p = &a; p = &b; int& r = a; r = b;//不是修改引用的目標,而是對r(a)進行賦值 //後面瞭解3)可以定義指標的指標(二級指標),但是不能定義引用的指標eg: int a = 100; int* p = &a; int** pp = &p; int& r = a; int& * pr = &r;//error int* pr = &r;//ok,是一個普通的指標4)可以定義指標的引用,但是不能定義引用的引用 eg: int a = 100; int* p = &a; int* & rp = p;//ok,指標的引用 ----------- int& r = a; int&& rr = r;//error,在C++11中稱為右值引用 int& r2 = r;//ok,不能稱為引用的引用,只是一個普通的引用,相當於給a再起一個別名。 5)可以指標數組,但是不能引用數組eg: int a=1,b=2,c=3; int* parr[3] = {&a,&b,&c};//指標數組 int& rarr[3] = {a,b,c};//error6)可以定義數組引用eg: int arr[3] = {1,2,3}; //rarr稱為數組引用,給數組起一個別名 int (&rarr)[3] = arr;//ok arr[0] <-等價-> rarr[0]7)和函數指標一樣,可以定義函數引用,文法和函數指標一致。eg: void func(int a,int b){...} int main(void){ //定義和使用函數指標 void (*pfunc)(int,int) = func; pfunc(10,20); //定義和使用函數引用 void (&rfunc)(int,int) = func; rfunc(10,20); }======================================十一 類型轉換1 隱式類型轉換eg: char c = ‘A‘; int n = c;//隱式類型轉換 ----------- void foo(int n){..} foo(c);//隱式類型轉換 ----------- int foo(void){ char c = ‘A‘; return c;//隱式類型轉換 }2 強制類型轉換eg: char c = ‘A‘; int n = (int)c;//C風格的強制轉換 int n = int(c);//C++風格的強制轉換3 C++增加了四種操作符形式的顯式類型轉換1)靜態類型轉換文法: 目標類型變數 = static_cast<目標類型>(源類型變數);適用情境: 用於將void*轉換為其它類型指標。eg: int a = 100; void* pv = &a;//ok int* pi = pv; //error int* pi = static_cast<int*>(pv);//ok 2)動態類型轉換(後面講)文法: 目標類型變數 = dynamic_cast<目標類型>(源類型變數);3)常類型轉換文法: 目標類型變數 = const_cast<目標類型>(源類型變數);適用情境:用於去除一個指標或引用的常屬性eg: int a = 100; const int* pa = &a; *pa = 200;//error int* pa2 = const_cast<int*>(pa); *pa2 = 200;//ok ------------------- const int& r = a; r = 300;//error int& r2 = const_cast<int&>(r); r2 = 300;//ok 4)重解釋類型轉換 文法: 目標類型變數 = reinterpret_cast<目標類型>(源類型變數); 適用情境: -->任意類型的指標或引用之間的轉換 -->在指標和整型數之間的轉換 eg: int addr = 0x12345678; int* p = reinterpret_cast<int*>(0x12345678); *p = 100;======================小結:1 慎用宏,用const、enum、inline替換#define PAI 3.14 --》const double PAI = 3.14 #define STATE_SLEEP 0#define STATE_RUN 1#define STATE_STOP 2--》enum STATE{SLEEP,RUN,STOP};#define max(a,b) ((a)>(b)?(a):(b))--> inline int max(int a,int b){ return a > b ? a : b; }2 變數隨用隨聲明同時初始化3 盡量使用new/delete分配,取代malloc/free4 少用void*、指標計算、聯合體、強制轉換5 盡量使用string表示字串,少用C中的char*表示的字串====================================十二 類和對象//瞭解1 什麼是對象? 萬物皆對象,任何一種事物都可以看做是對象。 2 如何描述對象? 通過對象的屬性(名詞、數量詞、形容詞)和行為(動詞)描述和表達對象。 3 物件導向的程式設計 對自然世界中對象觀察引入到編程實踐的一種理念和方法。這種方法稱為"資料抽象",即在描述對象時把細節的東西剝離出去,只考慮一般性的,有規律性的和統一性的東西。 4 什麼是類? 類是將多個對象的共性提取出來定義的一種新的資料類型,是對 對象的屬性和行為的抽象描述。
C++引用、類型轉換、類和對象(day03)