成员指针运算符 .* 和 -*

转载: 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.mzph.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;…