函數調用
使用括號調用的函數調用運算符是二元運算符。
語法
primary-expression ( expression-list )
備注
在此上下文中,primary-expression 為第一個操作數,并且 expression-list(可能為參數的空列表)為第二個操作數。函數調用運算符用于需要大量參數的操作。這之所以有效,是因為 expression-list 是列表而非單一操作數。函數調用運算符必須是非靜態成員函數。
函數調用運算符在重載時不會修改函數的調用方式;相反,它會在運算符應用于給定類的類型的對象時修改解釋該運算符的方式。例如,以下代碼通常沒有意義:
Point pt;pt( 3, 2 );
但是,如果存在一個適當的重載函數調用運算符,則此語法可用于將 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 );}
請注意,函數調用運算符適用于對象的名稱,而不是函數的名稱。
也可以使用指向函數的指針(而非該函數本身)重載函數調用運算符。
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] = 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[] 將檢測是否在使用超出邊界的下標并發出錯誤消息。
請注意,函數 operator[] 將返回引用類型。這會使它成為左值,從而使您可以在賦值運算符的任何一側使用下標表達式。
成員訪問
類成員訪問可通過重載成員訪問運算符 (–>) 來控制。此運算符被視為此用法中的一元運算符,而重載運算符函數必須是類成員函數。因此,此類函數的聲明是:
語法
class-type *operator–>()
備注
其中,class-type 是此運算符所屬的類的名稱。成員訪問運算符函數必須是非靜態成員函數。
此運算符(通常與指針取消引用運算符一起使用)用于實現在取消引用用法或對用法計數前驗證指針的“智能指針”。
無法重載 . 成員訪問運算符。