我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++成员解除引用运算符的示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++成员解除引用运算符的示例详解

下面看下成员解除引用运算符,C++允许定义指向类成员的指针,对这种指针进行声明或解除引用时,需要使用一种特殊的表示法。
例:

class Example
{
private:
    int feet;
    int inches;
public:
    Example();
    Example(int ft);
    ~Example();
    void show_in()const;
    void show_ft()const;
    void use_ptr()const;
};

如果没有具体的对象,则inches成员只是一个标签。也就是说,这个类将inches定义为一个成员标识符,但要为它分配内存。必须声明这个类的一个对象:

Example ob;//现在ob.inches存在

因此,可以结合使用标识符inches和特定的对象,来引用实际的内存单元(对于成员函数,可以省略对象名,但对象被认为是指针执行对象)。
C++允许这样定义一个指向标识符inches的成员指针:

int Example::*pt = &Example::inchers;

这种指针与常规指针有所区别。常规指针指向特定的单元格,而pt指针并不是指向特定的内存单元,因为声明中没有指出具体的对象。指针pt指的是inches成员在任意Example对象中的位置。和标识符inches一样,pt被设计与对象标识符要求使用。实际上。表达式*pt对标识符inches的角色做了假设,因此,可以使用对象标识符来指定访问的对象,使用pt指针来指定该对象的inches成员。例如:类方法可以使用下面得的代码:

int Example::*pt = &Example::inches;
Example ob1;
Example ob2;
Example *pq = new Example;
cout<<ob1.*pt<<endl;//ob1对象的inches成员
cout<<ob2.*pt<<endl;//ob2对象的inches成员
cout<<po->*pt<<endl;//*po对象的inches成员

其中,*和->*都是成员解除运算符,声明对象后,ob1.*pi指的将是ob1对象的inches成员,同样,pq->*pt指的是pq指向的对象的inxhes成员。
改变上述示例中使用的对象,将改变使用的inches成员。不过也可以修改pt指针本身。由于feet的类型与inches相同,因此可以将pt重新设置为指向feet成员(而不指向inches成员),这样ob1.*pt将是ob1的feet成员:

pt = &Example::feet;
cout<<ob1.*pt<<endl;//*pt相当于成员名,可用标识(相同类型)其他成员

可以使用成员指针标识成员函数,其语法稍微复杂的。对于不带任何参数、返回值为void的函数,声明一个指向函数的指针:

void (*pf)();//pf 指向函数

声明指向成员函数指针时,必须指出该函数所属的类。例:

void (Example::*pf)()const;//pf指向类成员函数

表明pf可用于使用Example方法地方。且Example::*pf必须放在括号中,可以将特定成员函数的地址赋给指针:

pf = &Example::show_inches;

注意,与普通函数指针的赋值情况不同,这里必须使用地址运算符,完成赋值操作后,便可以使用一个对象来调用该成员函数:

Example ob3(20);
(ob3.*pf)();//使用ob3对象调用show_feet()

必须将ob3*p放在括号中,以明确地指出,该表达式表示的是一个函数名。
由于show_feet()原型与show_inches()相同,因此也可以使用pf来访问show_feet()方法:

pf = &Example::show_feet;
(ob3*pf)();//将show_feet()应用于ob3对象

例:
下面程序use_ptr()方法,使用成员指针来访问Example类的数据成员和函数成员。

#include <iostream>
using namespace std;
class Example
{
private:
    int feet;
    int inches;
public:
    Example();
    Example(int ft);
    ~Example();
    void show_in()const;
    void show_ft()const;
    void use_ptr()const;
};
Example::Example()
{
    feet=0;
    inches=0;
}
Example::Example(int ft)
{
    feet=ft;
    inches=12*feet;
}
Example::~Example()
{
}
void Example::show_in()const
{
    cout<<inches<<"inches\n";
}
void Example::show_ft()const
{
    cout<<feet<<"feet\n";
}
void Example::use_ptr()const
{
    Example yard(3);
    int Example::*pt;
    pt=&Example::inches;
    cout<<"Set pt to &Example::inches:\n";
    cout<<"this->pt:"<<this->*pt<<endl;
    cout<<"yard.*pt:"<<yard.*pt<<endl;
    pt=&Example::feet;
    cout<<"Set pt to &Example::inches:\n";
    cout<<"this->pt:"<<this->*pt<<endl;
    cout<<"yard.*pt:"<<yard.*pt<<endl;
    void (Example::*pf)()const;
    pf=&Example::show_in;
    cout<<"Set pf to &Example::show_in:\n";
    cout<<"Using (this->*pf)():";
    (this->*pf)();
    cout<<"Using (yard.*pf)():";
    (yard.*pf);
}
int main()
{
    Example car(15);
    Example van(20);
    Example garage;
    cout<<"car.usr_ptr() output:\n";
    car.use_ptr();
    cout<<"\nvan.use_ptr()outptr:\n";
    van.use_ptr();
    return 0;
}

本例子在编译期间给指针赋值,在更为复杂的类中,可以使用指向数据成员和方法的成员指针。以便在运行阶段确定与指针关联的成员。

在这里插入图片描述

到此这篇关于C++成员解除引用运算符的示例详解的文章就介绍到这了,更多相关C++解除引用运算符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++成员解除引用运算符的示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++成员如何解除引用运算符

这期内容当中小编将会给大家带来有关C++成员如何解除引用运算符,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下面看下成员解除引用运算符,C++允许定义指向类成员的指针,对这种指针进行声明或解除引用时,需要
2023-06-26

C++ Qt利用GPU加速计算的示例详解

这篇文章主要为大家详细介绍了在 C++ 和 Qt 中如何利用GPU加速计算,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-09

C#中使用CAS实现无锁算法的示例详解

CAS(Compare-and-Swap)是一种多线程并发编程中常用的原子操作,用于实现多线程间的同步和互斥访问。本文将利用CAS实现无锁算法,需要的可以参考一下
2023-05-16

C++之值传递&指针传递&引用传递的示例详解

这篇文章主要为大家详细介绍了C++中值传递、指针传递和引用传递的定义与使用,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录