成員指針運算符 .* 和 -*

轉載:?http://www.groad.net/bbs/thread-5548-1-1.html

有一種特殊的指針叫做成員指針,它們通常指向一個類的成員,而不是對象中成員的特定實例。


成員指針并不是真正的指針,它只是成員在對象中的偏移量,它們分別是: .* ?和? ->* ?。

下面例子說明了成員指針?.*?的用法:

#include "stdafx.h"
#include <iostream>
using namespace std;


class myclass {
public:
int sum;
void myclass::sum_it(int x);
};


void myclass::sum_it(int x)
{
int i;
sum = 0;
for (i = x; i; i--) sum += i;
}


int _tmain(int argc, _TCHAR* argv[])
{
int myclass::*dp; //指向 myclass 中整數類型成員變量的指針
void (myclass::*fp)(int x); //指向 myclass 中成員函數的指針
myclass c;


dp = &myclass::sum; //獲得成員變量的地址
fp = &myclass::sum_it; //獲得成員函數的地址


(c.*fp)(7); //計算 1 到 7 相加的和
cout << "summation of 7 is " << c.*dp;


return 0;
}

運行輸出:?summation of 7 is 28


在上面程序中,創建了兩個成員指針 dp 和 fp 。其中 dp 指向了成員變量 sum ,fp 指向了函數 sum_it() 。

需要注意指針的聲明語法:在聲明中使用了作用域解析運算符來指定指針指向的成員屬于那個類。

當使用對象或對象引用來訪問對象的成員時,必須使用?.*?運算符,如程序中的 c.*fp 和 c.*dp 這種用法。

如果使用指向對象的指針來訪問對象的成員,那么必須使用 ->* 運算符,如下程序示例:
#include "stdafx.h"
#include <iostream>
using namespace std;


class myclass {
public:
int sum;
void myclass::sum_it(int x);
};


void myclass::sum_it(int x)
{
int i;
sum = 0;
for (i = x; i; i--) sum += i;
}


int _tmain(int argc, _TCHAR* argv[])
{
int myclass::*dp; //指向 myclass 中整數類型成員變量的指針
void (myclass::*fp)(int x); //指向 myclass 中成員函數的指針

myclass *c, d; //變量 c 顯示是指向對象的指針
c = &d; //將對一個對象的地址賦給 c




dp = &myclass::sum; //獲得成員變量的地址
fp = &myclass::sum_it; //獲得成員函數的地址


(c->*fp)(7); //計算 1 到 7 相加的和
cout << "summation of 7 is " << c->*dp;


return 0;
}

運行輸出:summation of 7 is 28

上面程序中,變量 c 是指向 myclass 類型對象的指針,所以應該使用 ->* 運算符來訪問 sum 和 sum_it() 。

成員指針是為了處理特殊情況而設計,在一般程序設計中通常不需要用到他們。

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

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

相關文章

捕捉Entity framework 6的詳細異常提示

采用 try{}catch (Exception e){throw;}不能捕捉到詳細異常提示, e.message的內容為"Validation failed for one or more entities. See EntityValidationErrors property for more details." 如果需要獲取詳細的異常提示,采用 1 try2 {3 return…

8.16——熟悉安裝linux系統

一、linux的版本——CentOS CentOS&#xff08;Community ENTerprise Operating System&#xff09;是Linux發行版之一&#xff0c;它是來自于Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。由于出自同樣的源代碼&#xff0c;因此有些要求高度穩定性的服…

linux中設置默認權限的命令,Linux默認權限掩碼

Linux教程Linux教程&#xff1a;http://www.fdlly.com/m/linux文章目錄默認權限掩碼設置權限掩碼以文字的方式設置權限掩碼查看系統當前的權限掩碼默認權限掩碼當我們創建文件或目錄時&#xff0c;系統會自動根據權限掩碼來生成預設權限&#xff1b;默認情況下的umask值是022(可…

percona-toolkit工具包安裝

percona-toolkit工具包同percona-xtrabackup一樣都是用Perl寫的工具包&#xff0c;percona-toolkit工具包是一組高級的管理mysql的工具包集&#xff0c;可以用來執行各種通過手工執行非常復雜和麻煩的mysql和系統任務&#xff0c;在生產環境中能極大的提高效率&#xff0c;安裝…

C++允許重載的運算符和不允許重載的運算符

C中絕大部分的運算符允許重載&#xff0c;具體規定見表10.1。 表10.1 C允許重載的運算符雙目算術運算符 (加)&#xff0c;-(減)&#xff0c;*(乘)&#xff0c;/(除)&#xff0c;% (取模) 關系運算符 (等于)&#xff0c;! (不等于)&#xff0c;< (小于)&#xff0c;> (大…

Google Mesa概覽

Google Mesa的文章&#xff1a;https://research.google.com/pubs/pub42851.html https://gigaom.com/2014/08/07/google-shows-off-mesa-a-super-fast-data-warehouse-that-runs-across-data-centers/ 為什么未來的Hadoop是實時的&#xff1a; https://gigaom.com/2013/03/0…

C++數組參數應用方式探討(轉)

對于經驗豐富的編程人員來說&#xff0c;C編程語言應該是他們經常使用于程序開發的一種實用性語言。那么&#xff0c;在C中&#xff0c;C數組參數永遠不會按值傳遞。它是傳遞第一個元素&#xff08;準確地說是第0個&#xff09;的指針。 例如&#xff0c;如下聲明&#xff1a; …

一篇關于兼容問題的基礎總結

1.添加兼容文件(以 es5-shim 為例) 方法一&#xff1a; <script src"https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script>在你的開發中&#xff0c;在需要為他做兼容的文件引入改文件 方法二(以模塊引入)&#xff1a; 在…

假如生活欺騙了你

假如生活欺騙了你&#xff0c; 不要悲傷&#xff0c;不要心急&#xff01; 憂郁的日子里需要鎮靜&#xff1a; 相信吧&#xff0c;快樂的日子將會降臨。 心兒永遠向往著未來&#xff1b; 現在卻常是憂郁&#xff0c; 一切都將會過去&#xff1b; 而那過去了的&#xff0c…

linux編譯mmc驅動,Embeded linux之MMC驅動

一、注冊平臺設備platform_device_register(&usr_mci_device);二、填寫平臺設備結構體static struct platform_device usr_mci_device {.name "xxx",.id 0,.dev {.release usr_mci_platdev_release,.dma_mask &usr_mmc_dmama…

redis windows下的環境搭建

先說下安裝吧&#xff01;感覺這東西跟mongodb差不多&#xff0c;安裝和布置挺簡單&#xff0c;下載地址&#xff1a;https://github.com/dmajkic/redis/downloads 下載下來的包里有兩個&#xff0c;一個是32位的&#xff0c;一個是64位的。根據自己的實情情況選擇&#xff0c;…

application/json 四種常見的 POST 提交數據方式

四種常見的 POST 提交數據方式 HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交數據&#xff0c;本文主要討論 POST 提交數據的幾種方式。 我們知道&#xff0c;HTTP 協議是以 ASCII 碼傳…

C++的4種類型轉換關鍵字及其特點

C中有四種類型轉換關鍵字&#xff0c;分別是reinterpret_cast,static_cast,const_cast,dynamic_cast.這是C 為了減少強制轉換的副作用&#xff0c;并且在查錯時使程序員能夠快速定位&#xff08;總是最值得懷疑的&#xff09;強制轉換&#xff0c;在標準C中新增加了4個關鍵字*…

linux系統數據庫類型,linux下的數據類型

sys/types.h sys/types.h中文名稱為基本系統數據類型。在應用程序源文件中包含 以訪問 _LP64 和 _ILP32 的定義。此頭文件還包含適當時應使用的多個基本派生類型。尤其是以下類型更為重要&#xff1a;caddr_t 核心地址。clock_t 表示系統時間(以時鐘周期為單位)。comp_t 壓縮的…

jsp亂碼

自從重裝系統之后電腦運行程序總是容易出現一些微妙的亂碼&#xff0c;一直都沒有徹底解決&#xff0c;有時候在別的機器上運行無誤的代碼一到我的機器上就出現一些問題。 myeclipse編碼方式怎么改都無效&#xff0c;每次只能再代碼中加上幾行轉碼的語句 今天終于找到罪魁禍首-…

如何使用Notepad++格式化XML文件

經常會從數據庫中讀到擠在一起的XML, 整理它們的格式需要使用一些工具. 比如筆者之前使用過online的tool. 后來經同事介紹, 改用VS2008的CtrlK, CtrlF來整理. 但是VS2008有點龐大, 開啟起來還是有點慢, 用起來也遠不如Notepad順手. 于是筆者Google了一把. 找到了下面的步驟, 非…

@MySQL的存儲引擎

1.存儲引擎 查看MySQL提供了哪些存儲引擎 mysql> show engines; ----------------------------------------------------------------------------------------------------------------------------- | Engine | Support | Comment …

聯想u盤linux安裝教程,聯想筆記本用U盤安裝 winXP系統教程

聯想筆記本用U盤安裝 winXP系統教程。聯想筆記本是指聯想集團生產的便攜手提電腦。 聯想集團成立于1984年&#xff0c;由中科院計算所投資20萬元人民幣、11名科技人員創辦&#xff0c;到今天已經發展成為一家在信息產業內多元化發展的大型企業集團。今天小編將給大家介紹使用U盤…

sharepoint 彈出框

在父頁面寫如下代碼 function showDialog() {var options {url: "page.aspx",args: 7,title: "選擇頁面",dialogReturnValueCallback: dialogCallback};SP.UI.ModalDialog.showModalDialog(options);}//接收返回值方法function dialogCallback(dialogResu…

jquery 異常

今天遇到一個jquery的錯誤&#xff0c;too much recursion&#xff08;遞歸&#xff09;,其實這個錯誤是由于程序里出現太多的重復動作//以dialog的拖拉為例 if (top<0) {} 在這里&#xff0c;如果top<0,lastTop<top的話&#xff0c;則這兩個動作都會執行&#xff0c;…