2010年10月18日 星期一

[C++ 小學堂] 運算符重載 : 下標運算符重載

下標運算符是二元運算, C++編譯器將如下表示: 
sz[x]; 

解釋為: 
sz.operator[](x); 

一般情況下, 下標運算符的重載函數原型如下: 
返回類行& operator[ ] (參數類行) 


下標運算符的重載函數只能有一個參數, 不過該參數沒有類型限制, 如果類中並未重載下標運算符, 編譯器將提供預設定義, 此時參數必需是int 型, 並且要聲明為數組名才能使用下標變量. 
Ps. 返回的類型使得返回值可以為左值. 

==================範例代碼 CharSZ911.h:====================
  1. #include "main.h"  
  2.   
  3. class CharSZ911{  
  4.     int Len;  
  5.     char* pBuf;  
  6. public:  
  7.     CharSZ911(int l){  
  8.         Len = l;  
  9.         pBuf = new char[Len];  
  10.     }  
  11.     ~CharSZ911(){  
  12.         delete[] pBuf;  
  13.     }  
  14.   
  15.     int getLen(){  
  16.         return Len;  
  17.     }  
  18.   
  19.     char& operator [](int i);  
  20. };  




===================範例代碼 CharSZ911.cpp:===================
  1. #include "CharSZ911.h"  
  2.   
  3. char& CharSZ911::operator [](int i){  
  4.     static char def = '\0';  
  5.     if(i
  6.         return pBuf[i];  
  7.     }else{  
  8.         cout << "下標越界!" << endl;  
  9.         return def;  
  10.     }  
  11. }  



===================範例代碼 example_ch9.cpp:===================
  1. ...  
  2. void example911(){  
  3.     int cnt = 0 ;  
  4.     CharSZ911 de(7);  
  5.     char* sz = "Helloo";  
  6.     for(;cnt < (strlen(sz)+1);cnt++){  
  7.         de[cnt] = sz[cnt];  
  8.     }  
  9.     for(cnt=0; cnt
  10.         cout << cnt << ".("<< de[cnt] << ") ";  
  11.     }  
  12.     cout << endl;  
  13. }  
  14. ...  


結果: 
0.(H) 1.(e) 2.(l) 3.(l) 4.(o) 5.(o) 6.( ) 

Ps. 重載[] 後便可以對普通CharSZ911對像進行[]運算

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...