1. 程式人生 > >C++_class_powerpoint_1.2

C++_class_powerpoint_1.2

solution size ide 實參 gpo 空閑 bad use efi

用英文編寫(復制黏貼)果然比較吃力啊,果然還是要寫中文。

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     int
x=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>
    (expression)

     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 .*
    p2member
    pointer ->* p2member

  • Throw exception
    throw expression

Free store

  1. 命名對象(named object)的生命周期由其作用域(scope)決定,內存分配位於靜態數據區域或堆棧中(data area,stack)。
  2. 在空閑存儲(動態內存dynamic memory、堆heap)中創建的對象的生命周期與範圍無關
  3. C中malloc和free是一個庫函數,而C++的new和delete是運算符。
  4. 由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