程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++中的函數挪用和下標和成員拜訪運算符的重載

詳解C++中的函數挪用和下標和成員拜訪運算符的重載

編輯:關於C++

詳解C++中的函數挪用和下標和成員拜訪運算符的重載。本站提示廣大學習愛好者:(詳解C++中的函數挪用和下標和成員拜訪運算符的重載)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中的函數挪用和下標和成員拜訪運算符的重載正文


函數挪用
應用括號挪用的函數挪用運算符是二元運算符。
語法

primary-expression ( expression-list )

備注
在此高低文中,primary-expression 為第一個操作數,而且 expression-list(能夠為參數的空列表)為第二個操作數。函數挪用運算符用於須要年夜量參數的操作。這之所以有用,是由於 expression-list 是列表而非單一操作數。函數挪用運算符必需長短靜態成員函數。
函數挪用運算符在重載時不會修正函數的挪用方法;相反,它會在運算符運用於給定類的類型的對象時修正說明該運算符的方法。例如,以下代碼平日沒成心義:

Point pt;
pt( 3, 2 );

然則,假如存在一個恰當的重載函數挪用運算符,則此語法可用於將 x 坐標偏移 3 個單元並將 y 坐標偏移 2 個單元。上面的代碼顯示了如許的界說:

// function_call.cpp
class 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 );
}

請留意,函數挪用運算符實用於對象的稱號,而不是函數的稱號。
也能夠應用指向函數的指針(而非該函數自己)重載函數挪用運算符。

typedef void(*ptf)();
void func()
{
}
struct S
{
  operator ptf()
  {
   return func;
  }
};

int main()
{
  S s;
  s();//operates as s.operator ptf()()
}

下標
下標運算符 ([ ])(如函數挪用運算符)被視為二元運算符。下標運算符必需是采取單個參數的非靜態成員函數。此參數可所以任何類型,並指定所需的數組下標。
以下示例演示若何創立用於完成界限檢討的 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] = 0
Element: [1] = 1
Element: [2] = 2
Element: [3] = 9
Element: [4] = 4
Element: [5] = 5
Element: [6] = 6
Element: [7] = 7
Element: [8] = 8
Element: [9] = 9
Array bounds violation.
Element: [10] = 10

正文
當 i 在前一個法式中到達 10 時,operator[] 將檢測能否在應用超越界限的下標並收回毛病新聞。
請留意,函數 operator[] 將前往援用類型。這會使它成為左值,從而使您可以在賦值運算符的任何一側應用下標表達式。

成員拜訪
類成員拜訪可經由過程重載成員拜訪運算符 (–>) 來掌握。此運算符被視為此用法中的一元運算符,而重載運算符函數必需是類成員函數。是以,此類函數的聲明是:
語法

class-type *operator–>()

備注
個中,class-type 是此運算符所屬的類的稱號。成員拜訪運算符函數必需長短靜態成員函數。
此運算符(平日與指針撤消援用運算符一路應用)用於完成在撤消援用用法或對用法計數前驗證指針的“智能指針”。
沒法重載 . 成員拜訪運算符。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved