C++_class_powerpoint_1.2
用英文編寫(復制黏貼)果然比較吃力啊,果然還是要寫中文。
Expressions and Statements
Operator summary
- Scope resolution class::member
namespace::member
- Global ::name
::qualified-name
1 namespace NS { int x; } 2 int x; 3 void f() 4 { 5 intx=1; 6 ::x=2; 7 ::NS::x=3; 8 x=4; 9 … 10 }
在命名空間裏使用同名變量,不影響。
- Value construction type(expression)
- Type identification typeid(type)
- Type cast dynamic_cast<T>(expression)
static_cast<T>(expression)
reinterpret_cast<T>
const_cast<T>(expression) - Create new T
new T(expr-list)
new (expr-list) T
new (expr-list) T (expr-list) - Destroy delete pointer
delete[] pointer - Member selection
object .*
pointer ->* p2member
- Throw exception
throw expression
Free store
- 命名對象(named object)的生命周期由其作用域(scope)決定,內存分配位於靜態數據區域或堆棧中(data area,stack)。
- 在空閑存儲(動態內存dynamic memory、堆heap)中創建的對象的生命周期與範圍無關
- C中malloc和free是一個庫函數,而C++的new和delete是運算符。
- 由new創建的對象直到被delete刪除之前始終存在;delete的操作數必須是由new返回的指針。
1 int* pi = new int{5}; 2 // using by expression *pi 3 delete pi;
又如
1 char* save_string(const char* p) 2 { char* s= new char[strlen(p)+1]{}; 3 strcpy(s,p); 4 return s; 5 } 6 int main(int argc,char** argv) 7 { char* p=save_string(argv[1]); 8 … 9 delete[] p; 10 }
1 void f(int n) 2 { 3 vector<int>* p = new vector<int>(n); 4 int* q = new int[n]{2,6}; 5 … 6 delete p; 7 delete[] q; 8 }
5.當new不能找到free store時,出錯:bad_alloc(聲明在new中)
6.當內存耗盡時,系統首先調用set_new_handler(在<new>中聲明)。
Type cast
1 void* malloc(size_t); 2 void f() 3 { 4 int* p = 5 static_cast<int*>(malloc(100)); 6 … 7 }
reinterpret_cast:用於非標準的類型轉換,如從一種指針到另一種,int*->char*
不能用於標準轉換,如double->int
1 void f() 2 { 3 IO_device* p = 4 reinterpret_cast<IO_device*>(0xff00); 5 … 6 } 7 // same bit pattern, different interpretations
const_cast:
1 void f() 2 { const int i=100; 3 const int* p = &i; 4 int* q = const_cast<int*>(p); 5 … 6 } 7 // removing const modifier
Constructors
用T(e)或T{e}表示值e的T類型值的構造。
當e被省略時,T()或T{}被用來表示T類型的默認值(default value)。
似乎解釋了集合棧計算機題中將set<int>()傳入函數的意圖。
1 double d=1.3; 2 int i = int{d}; 3 int j = static_cast<int>(d); 4 int k = int{}; // 0 5 cout<< i <<‘ ‘<<j<<‘ ‘<<k<<endl;//1 1 0
Declaration statements
在條件中聲明的標識符範圍擴展到條件控制語句的末尾。在這裏只能聲明一個id。
1 if (double d=prim(true)) 2 { 3 left /= d; 4 break; 5 }
Comments
不用說了
Function
Inline functions
inline int f(int n) {return n<2 ? 1 : n * f(n-1);}
這是對編譯器的一個提示(不是命令),它應該嘗試為每個函數調用生成代碼。函數的語義沒有改變。一般來說,內聯函數提高了效率,但是增加了可執行文件的長度。通常,長度只有幾行代碼的函數應該是內聯的。否則,大型函數不應該內聯。
Argument passing
參數傳遞的語義是初始化(不是賦值)。
這對於const參數、引用參數和一些用戶定義的參數很重要。
引用傳遞的作用:修改傳遞的參數,效率(使用const T&)
- T&: 參數必須是變量,實參的類型必須和形參一致
- const T&: 可以傳遞字面量,常量,或由類型轉換生成的對象。
1 float fsqrt(const float&); 2 double d; 3 float r = fsqrt(2.0f);//t.o. 4 r = fsqrt(r); 5 r = fsqrt(d); // t.o.
1 float fsqrt(float&); 2 double d; 3 float r = fsqrt(2.0f); //ERROR!! 4 r = fsqrt(r); 5 r = fsqrt(d); // ERROR! 6
Value return
- 函數返回的語義是初始化(不是賦值)。
- 返回語句被認為初始化函數類型的一個臨時對象。
- 不要返回指針或本地變量的引用!
- 經常使用“move”語義而不是“copy”
1 float fsqrt(const float& r) 2 { float x; 3 … 4 return x; // float temp=x; 5 } 6 float d; 7 float r= fsqrt(d); 8 // r=temp, then temp is destroyed. 9 // temp may be optimized away 10 // by some compilers.
Overloaded functions
重載——使用相同的名稱來處理不同類型的函數。
在編譯時,編譯器通過將實參的類型與形參的類型進行比較(而不是比較返回類型)來解決重載函數的問題。
[1] Exact match;
[2] Match using promotions;
[3] Match using standard conversions;
[4] Match using user-defined conversions;
[5] Mismatch, function undeclared.
如果找到了兩個匹配項,函數調用失敗。
1 void print(double); 2 void print(long); 3 4 print(1L); // print(long) 5 print(1.0); // print(double) 6 print(1); 7 // standard conversion : int?double, int?long 8 // ambiguous: print(long(1)) or print(double(1))? 9 // solution: [see Ambiguity Resolution Slide later]
1 void print(double); 2 void print(long); 3 print(1); 4 ? 5 print(static_cast<double>(1)); 6 //Or 7 print(static_cast<long>(1));
多參數時,為每一個參數找到最佳的匹配,一個函數的一個參數要是最佳匹配,其余參數只有都一樣匹配或者更匹配,才會調用成功(A function that is best match for one argument and a better than or equal match for all other arguments is called.)不滿足以上條件,調用失敗(rejected as ambiguous)。
1 int pow(int ,int ); 2 double pow(double,double); 3 4 double d = pow (2.0 , 2); 5 //best match for arg1 is the second 6 //best match for arg2 is the first 7 // ambiguous!
在不同的非名稱空間範圍中聲明的函數沒有重載
1 void f(int); 2 void g() 3 { 4 void f(double); 5 f(1); // f(double) 6 }
Default arguments
一般的函數通常需要更多的參數來處理簡單的情況。
1 void print(int val, int base); 2 //in most cases, print in base 10 ; 3 // sometimes, print in base 2 , 8 , 16 4 void print(int val, int base = 10);
默認參數是在函數聲明時檢查的類型,並在調用時進行評估。
1 int g(int); 2 void f(int = g(5)); 3 // type checking 4 5 f(); 6 // default value computing
默認參數僅為尾隨參數提供。
1 void f1(int, int=0, char* =0); 2 3 void f2(int, int=0, char* ); 4 // Error! 5 void f3(int=0, int, char* =0); 6 // Error!
在同一範圍內的後續聲明中不能重復或更改默認參數。
1 void f(int = 7); 2 void f(int); 3 void f(int = 7); // error! 4 void f(int = 8); // error! 5 void g() 6 { void A::f(int x = 9); 7 // another function 8 … 9 }
C++_class_powerpoint_1.2