国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++中的函數(shù)調(diào)用和下標以及成員訪問運算符的重載

2020-01-26 14:45:12
字體:
供稿:網(wǎng)友

函數(shù)調(diào)用
使用括號調(diào)用的函數(shù)調(diào)用運算符是二元運算符。
語法

primary-expression ( expression-list )

備注
在此上下文中,primary-expression 為第一個操作數(shù),并且 expression-list(可能為參數(shù)的空列表)為第二個操作數(shù)。函數(shù)調(diào)用運算符用于需要大量參數(shù)的操作。這之所以有效,是因為 expression-list 是列表而非單一操作數(shù)。函數(shù)調(diào)用運算符必須是非靜態(tài)成員函數(shù)。
函數(shù)調(diào)用運算符在重載時不會修改函數(shù)的調(diào)用方式;相反,它會在運算符應(yīng)用于給定類的類型的對象時修改解釋該運算符的方式。例如,以下代碼通常沒有意義:

Point pt;pt( 3, 2 );

但是,如果存在一個適當?shù)闹剌d函數(shù)調(diào)用運算符,則此語法可用于將 x 坐標偏移 3 個單位并將 y 坐標偏移 2 個單位。下面的代碼顯示了這樣的定義:

// function_call.cppclass Point{public:  Point() { _x = _y = 0; }  Point &operator()( int dx, int dy )    { _x += dx; _y += dy; return *this; }private:  int _x, _y;};int main(){  Point pt;  pt( 3, 2 );}

請注意,函數(shù)調(diào)用運算符適用于對象的名稱,而不是函數(shù)的名稱。
也可以使用指向函數(shù)的指針(而非該函數(shù)本身)重載函數(shù)調(diào)用運算符。

typedef void(*ptf)();void func(){}struct S{  operator ptf()  {   return func;  }};int main(){  S s;  s();//operates as s.operator ptf()()}

下標
下標運算符 ([ ])(如函數(shù)調(diào)用運算符)被視為二元運算符。下標運算符必須是采用單個參數(shù)的非靜態(tài)成員函數(shù)。此參數(shù)可以是任何類型,并指定所需的數(shù)組下標。
以下示例演示如何創(chuàng)建用于實現(xiàn)邊界檢查的 int 類型的矢量:

// subscripting.cpp// compile with: /EHsc#include <iostream>using namespace std;class IntVector {public:  IntVector( int cElements );  ~IntVector() { delete [] _iElements; }  int& operator[]( int nSubscript );private:  int *_iElements;  int _iUpperBound;};// Construct an IntVector.IntVector::IntVector( int cElements ) {  _iElements = new int[cElements];  _iUpperBound = cElements;}// Subscript operator for IntVector.int& IntVector::operator[]( int nSubscript ) {  static int iErr = -1;  if( nSubscript >= 0 && nSubscript < _iUpperBound )   return _iElements[nSubscript];  else {   clog << "Array bounds violation." << endl;   return iErr;  }}// Test the IntVector class.int main() {  IntVector v( 10 );  int i;  for( i = 0; i <= 10; ++i )   v[i] = i;  v[3] = v[9];  for ( i = 0; i <= 10; ++i )   cout << "Element: [" << i << "] = " << v[i] << endl;}Array bounds violation.Element: [0] = 0Element: [1] = 1Element: [2] = 2Element: [3] = 9Element: [4] = 4Element: [5] = 5Element: [6] = 6Element: [7] = 7Element: [8] = 8Element: [9] = 9Array bounds violation.Element: [10] = 10

注釋
當 i 在前一個程序中達到 10 時,operator[] 將檢測是否在使用超出邊界的下標并發(fā)出錯誤消息。
請注意,函數(shù) operator[] 將返回引用類型。這會使它成為左值,從而使您可以在賦值運算符的任何一側(cè)使用下標表達式。

成員訪問
類成員訪問可通過重載成員訪問運算符 (

主站蜘蛛池模板: 乌拉特后旗| 额尔古纳市| 建昌县| 河南省| 荆州市| 阿巴嘎旗| 本溪| 宜兰市| 喀什市| 许昌市| 云和县| 仙桃市| 日照市| 新营市| 崇明县| 石河子市| 池州市| 东阿县| 万年县| 阳春市| 雷州市| 习水县| 综艺| 大理市| 兴文县| 兴山县| 松桃| 迭部县| 汉川市| 吉林省| 秭归县| 天峻县| 兴国县| 碌曲县| 辛集市| 资兴市| 浑源县| 平远县| 沾化县| 丰原市| 五指山市|