詳解C++中的函數調用和下標以及成員訪問運算符的重載

http://www.jb51.net/article/78436.htm

這篇文章主要介紹了詳解C++中的函數調用和下標以及成員訪問運算符,講到了這些二元運算符使用的語法及重載,需要的朋友可以參考下

函數調用
使用括號調用的函數調用運算符是二元運算符。
語法

?
1
primary-expression ( expression-list )

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

?
1
2
Point pt;
pt( 3, 2 );

但是,如果存在一個適當的重載函數調用運算符,則此語法可用于將 x 坐標偏移 3 個單位并將 y 坐標偏移 2 個單位。下面的代碼顯示了這樣的定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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 );
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef void(*ptf)();
void func()
{
}
struct S
{
operator ptf()
{
return func;
}
};
int main()
{
S s;
s();//operates as s.operator ptf()()
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 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[] 將返回引用類型。這會使它成為左值,從而使您可以在賦值運算符的任何一側使用下標表達式。

成員訪問
類成員訪問可通過重載成員訪問運算符 (–>) 來控制。此運算符被視為此用法中的一元運算符,而重載運算符函數必須是類成員函數。因此,此類函數的聲明是:
語法

?
1
class-type *operator–>()

備注
其中,class-type 是此運算符所屬的類的名稱。成員訪問運算符函數必須是非靜態成員函數。
此運算符(通常與指針取消引用運算符一起使用)用于實現在取消引用用法或對用法計數前驗證指針的“智能指針”。
無法重載 . 成員訪問運算符。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384141.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

A計劃——BFS

【題目描述】 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后&#xff0c;而今&#xff0c;不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主&#xff0c;因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚&#xff0c;告招天下勇士…

使用openssl的md5庫

http://blog.csdn.net/sinat_35297665/article/details/78244523 在linux機器上&#xff0c;有一個命令可以計算出文件的md5值&#xff0c;那就是md5sum&#xff0c;如果沒有的話&#xff0c;就需要安裝RPM包&#xff1a;coreutils。 現在我們使用openssl的庫也可以方便的計算出…

主席樹入門

今天學習了一下主席樹&#xff08;名字這么強的嘛&#xff09; 雖然直接理解起來不容易&#xff0c;但是這種解決問題的思想其實并不陌生。 我們可以首先來看維護整個區間第K大的線段樹 我們將[l,r]區間內數字的多少用線段樹進行維護&#xff0c;這樣的話為了求取區間第k大&…

Socket網絡編程--小小網盤程序(1)

http://www.cnblogs.com/wunaozai/p/3886588.html 這個系列是準備講基于Linux Socket進行文件傳輸。簡單的文件傳輸就是客戶端可以上傳文件&#xff0c;可以從服務器端下載文件。就這么兩個功能如果再加上身份驗證&#xff0c;就成了FTP服務器了&#xff0c;如果對用戶的操作再…

使用 Verdaccio 構建自己的私有 npm 倉庫

前言 無論你是公司的開發者&#xff0c;還是個人開發者&#xff0c;你可能都聽說過或者使用過 npm&#xff0c;這是一個使用廣泛的 JavaScript 包管理器。但是&#xff0c;你是否遇到過以下的問題&#xff1a;你需要一個私有的包存放地方&#xff0c;或者你需要在離線環境下使…

HDU - 4348To the moon——主席樹+區間修改

HDU - 4348To the moon 【題目描述】 【題目分析】 題目中說明每次更新后時間都會加1&#xff0c;而且還會需要查詢以前的區間&#xff0c;還會需要返回以前的時間&#xff0c;所以是很裸的主席樹。區間查詢的話我們同樣需要用到lazy標記 通過這道題我發現線段樹的操作還是很靈…

進入一個目錄需要那些權限

1.文件訪問者的分類 文件的訪問者具體可分為以下幾類&#xff1a; (1)擁有者 (2)組擁有者 (3)其他用戶 這些都代表什么意思呢&#xff1f; 其中r表示只讀&#xff0c;w表示只寫&#xff0c;x表示可執行&#xff0c;第一個字母代表了文件的類型&#xff0c;其中文件類型可以分為…

Socket網絡編程--小小網盤程序(2)

http://www.cnblogs.com/wunaozai/p/3887728.html 這一節將不會介紹太多的技術的問題&#xff0c;這節主要是搭建一個小小的框架&#xff0c;為了方便接下來的繼續編寫擴展程序。本次會在上一小節的基礎上加上一個身份驗證的功能。 因為網盤程序不像聊天程序&#xff0c;網盤是…

Linux下的重要目錄

1.bin目錄 主要防止系統下的各種必備可執行文件 2./proc 目錄 這個目錄相當于Windows下的計算機系統信息查看以及進程動態查看&#xff0c;可以查看計算機信息&#xff0c;用來存放當前計算機上的進程信息 3./sys 目錄 (1)其中block目錄用于存放塊設備文件 (2)bus存放總線類型…

HDU - 6278 Just $h$-index主席樹+二分

HDU - 6278 Just hhh-index 【題目描述】 【題目分析】 題目要求在區間[l,r][l,r][l,r]內大于h的數不少于h個&#xff0c;對于這種最大化問題&#xff0c;我們應該想到二分。 最小情況顯然是1.最大情況顯然是r?l1r-l1r?l1&#xff0c;對于一個hhh&#xff0c;我們如何判斷能…

Socket網絡編程--小小網盤程序(3)

http://www.cnblogs.com/wunaozai/p/3891062.html 接上一小節&#xff0c;這次增加另外的兩張表&#xff0c;用于記錄用戶是保存那些文件。增加傳上來的文件的文件指紋&#xff0c;使用MD5表示。 兩張表如下定義: 1 create table files(2 fid int,3 filename varchar(64),4 md…

LInux下du, df, top, free, pstack, su, sudo, adduser, password命令

1.du命令&#xff1a;du [選項] 文件 (1)功能該命令是顯示指定文件以及下的所有文件占用系統數據塊的情況&#xff0c;如果沒有文件&#xff0c;默認為是當前工作目錄 -a ???顯示所有文件對系統數據塊的使用情況 -b ???顯示數據塊大小時以字節為基本單位 -c ???除了顯…

HDU - 5919 Sequence II——主席樹+區間種類++逆序建樹

【題目描述】 HDU - 5919 Sequence II 【題目分析】 題目給定一個數組&#xff0c;每次查詢一個區間&#xff0c;找出區間內不同數字的個數x&#xff0c;然后輸出按出現順序第x/2向上取整個數字的位置。 按照要求&#xff0c;我們首先需要能夠找出給定區間不同的數字個數。 首…

Socket網絡編程--小小網盤程序(4)

http://www.cnblogs.com/wunaozai/p/3892729.html 在這一小節中實現了文件的下載&#xff0c;具體的思路是根據用戶的uid和用戶提供的文件名filename聯合兩張表&#xff0c;取得md5唯一標識符&#xff0c;然后操作這個標識符對應的文件發送給客戶端。 實現下載的小小網盤程序 …

靜態順序表的實現

實現對順序表的初始化&#xff0c;頭插&#xff0c;頭刪&#xff0c;尾插&#xff0c;尾刪&#xff0c; 任意下標的刪除&#xff0c; 任意下標處的的元素刪除&#xff0c;任意下標處的元素插入&#xff0c;任意元素的下標返回&#xff0c;任意下標處的元素返回&#xff0c; 刪除…

樹鏈剖分入門+HYSBZ - 1036樹的統計Count

今天學習了樹鏈剖分&#xff0c;記錄一下。 【題目背景】 HYSBZ - 1036樹的統計Count 【題目分析】 題目要求求任意結點之間路徑的和以及路徑上最大的結點&#xff0c;還有可能修改。如果正常做可能會很復雜&#xff08;我也不知道正常應該怎么做&#xff0c;應該要用到LCA什么…

Socket網絡編程--小小網盤程序(5)

http://www.cnblogs.com/wunaozai/p/3893469.html 各位好呀&#xff01;這一小節應該就是這個小小網盤程序的最后一小節了&#xff0c;這一節將實現最后的三個功能&#xff0c;即列出用戶在服務器中的文件列表&#xff0c;還有刪除用戶在服務器中的文件&#xff0c;最后的可以共…

進程相關概念

1.進程相關概念 進程是代碼的一次動態執行&#xff0c;擔當分配系統資源的角色&#xff0c;進程信息是被放在一個一個數據結構中&#xff0c;是一個結構體task_struct 2.進程控制塊內容 //linux下的進程控制塊 struct task_struct {volatile long state;// 說明了該進程是否可以…

SPOJ - QTREE3Query on a tree again!——樹鏈剖分

【題目描述】 SPOJ - QTREE3Query on a tree again! 【題目分析】 題目要求是輸出從111到xxx的路徑上遇到的第一個黑色的點。我們可以用樹鏈剖分&#xff08;不了解的同學請出門左拐&#xff0c;詳見樹鏈剖分入門&#xff09; 我們用線段樹維護每個區間第一次遇到黑點的位置&a…

C++中的函數指針和函數對象總結

http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html 篇一、函數指針 函數指針&#xff1a;是指向函數的指針變量&#xff0c;在C編譯時&#xff0c;每一個函數都有一個入口地址&#xff0c;那么這個指向這個函數的函數指針便指向這個地址。 函數指針的用途是很…