詳解C++中的函數(shù)調(diào)用和下標(biāo)以及成員訪問(wèn)運(yùn)算符的重載
函數(shù)調(diào)用
使用括號(hào)調(diào)用的函數(shù)調(diào)用運(yùn)算符是二元運(yùn)算符。
語(yǔ)法
primary-expression ( expression-list )
備注
在此上下文中,primary-expression 為第一個(gè)操作數(shù),并且 expression-list(可能為參數(shù)的空列表)為第二個(gè)操作數(shù)。函數(shù)調(diào)用運(yùn)算符用于需要大量參數(shù)的操作。這之所以有效,是因?yàn)?expression-list 是列表而非單一操作數(shù)。函數(shù)調(diào)用運(yùn)算符必須是非靜態(tài)成員函數(shù)。
函數(shù)調(diào)用運(yùn)算符在重載時(shí)不會(huì)修改函數(shù)的調(diào)用方式;相反,它會(huì)在運(yùn)算符應(yīng)用于給定類(lèi)的類(lèi)型的對(duì)象時(shí)修改解釋該運(yùn)算符的方式。例如,以下代碼通常沒(méi)有意義:
Point pt; pt( 3, 2 );
但是,如果存在一個(gè)適當(dāng)?shù)闹剌d函數(shù)調(diào)用運(yùn)算符,則此語(yǔ)法可用于將 x 坐標(biāo)偏移 3 個(gè)單位并將 y 坐標(biāo)偏移 2 個(gè)單位。下面的代碼顯示了這樣的定義:
// 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 );
}
請(qǐng)注意,函數(shù)調(diào)用運(yùn)算符適用于對(duì)象的名稱,而不是函數(shù)的名稱。
也可以使用指向函數(shù)的指針(而非該函數(shù)本身)重載函數(shù)調(diào)用運(yùn)算符。
typedef void(*ptf)();
void func()
{
}
struct S
{
operator ptf()
{
return func;
}
};
int main()
{
S s;
s();//operates as s.operator ptf()()
}
下標(biāo)
下標(biāo)運(yùn)算符 ([ ])(如函數(shù)調(diào)用運(yùn)算符)被視為二元運(yùn)算符。下標(biāo)運(yùn)算符必須是采用單個(gè)參數(shù)的非靜態(tài)成員函數(shù)。此參數(shù)可以是任何類(lèi)型,并指定所需的數(shù)組下標(biāo)。
以下示例演示如何創(chuàng)建用于實(shí)現(xiàn)邊界檢查的 int 類(lèi)型的矢量:
// 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
注釋
當(dāng) i 在前一個(gè)程序中達(dá)到 10 時(shí),operator[] 將檢測(cè)是否在使用超出邊界的下標(biāo)并發(fā)出錯(cuò)誤消息。
請(qǐng)注意,函數(shù) operator[] 將返回引用類(lèi)型。這會(huì)使它成為左值,從而使您可以在賦值運(yùn)算符的任何一側(cè)使用下標(biāo)表達(dá)式。
成員訪問(wèn)
類(lèi)成員訪問(wèn)可通過(guò)重載成員訪問(wèn)運(yùn)算符 (–>) 來(lái)控制。此運(yùn)算符被視為此用法中的一元運(yùn)算符,而重載運(yùn)算符函數(shù)必須是類(lèi)成員函數(shù)。因此,此類(lèi)函數(shù)的聲明是:
語(yǔ)法
class-type *operator–>()
備注
其中,class-type 是此運(yùn)算符所屬的類(lèi)的名稱。成員訪問(wèn)運(yùn)算符函數(shù)必須是非靜態(tài)成員函數(shù)。
此運(yùn)算符(通常與指針取消引用運(yùn)算符一起使用)用于實(shí)現(xiàn)在取消引用用法或?qū)τ梅ㄓ?jì)數(shù)前驗(yàn)證指針的“智能指針”。
無(wú)法重載 . 成員訪問(wèn)運(yùn)算符。
相關(guān)文章
c++網(wǎng)絡(luò)編程下Linux的epoll技術(shù)和Windows下的IOCP模型
c++ 網(wǎng)絡(luò)編程LINUX-epoll/windows-IOCP下socket opoll函數(shù)用法 優(yōu)于select方法的epoll 以及windows下IOCP 解決多進(jìn)程服務(wù)端創(chuàng)建進(jìn)程資源浪費(fèi)問(wèn)題,感興趣的小伙伴一起來(lái)學(xué)習(xí)吧2021-08-08
基于C語(yǔ)言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
這篇文章主要為大家詳細(xì)介紹如何基于C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-07-07
C++用read()和write()讀寫(xiě)二進(jìn)制文件的超詳細(xì)教程
二進(jìn)制的文件肉眼我們是讀不懂的,如果通過(guò)二進(jìn)制的讀寫(xiě)操作就可以讀懂,下面這篇文章主要給大家介紹了關(guān)于C++用read()和write()讀寫(xiě)二進(jìn)制文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Matlab實(shí)現(xiàn)讀寫(xiě)txt文件數(shù)據(jù)與進(jìn)制轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Matlab實(shí)現(xiàn)讀寫(xiě)txt文件數(shù)據(jù)與進(jìn)制轉(zhuǎn)換的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

