C++指向类成员(数据、函数)的指针

2023-10-27

指向【类】的成员的指针包含两种:

  • ★指向【类】的数据成员的指针
  • ★指向【类】的成员函数的指针
    注意:指向的是【类的成员】,和类发生关系
    ★★★指向非静态公有数据成员的指针,在定义时必须和类相关联,在使用时必须和对象相关联

1、指向类的数据成员的指针

1.1 定义+初始化的格式:
数据类型 类型:: *指针名 = &类型:: 非静态公有数据成员

1.2通过数据成员指针访问数据成员的格式:

  • 对象.*数据成员指针
  • 对象指针—>*数据成员指针
    class   Stu
        {
        public:
                string name;
                int age;
        } 
        int   Stu ::  *pAge  =&Stu::age;//★定义一个指向类的Stu数据成员age的指针
        string Stu :: *pName=&Stu::name;//★定义有个指向Stu数据成员name的指针

例1、代码及运行结果

#include<iostream>
#include <string>
using namespace std;
class Stu
{
public:
    string name;
    int   age;
public:
    Stu(string str="NULL",int ag=0):name(str),age(ag)//构造器初始化
    {
    }
    void Show()
    {
        cout<<name<<"   "<<age<<endl       ;
    }
};
int main()
{
       Stu s1;//使用默认参数创建对象
       Stu s2("LaoWang",66);//传参创建对象

        string Stu::*pName =&Stu::name;//★定义时和类关联
        int Stu::*pNum=&Stu::age;   //★定义时和类关联

        cout<<s1.name<<"    "<<s1.age<<endl;
        cout<<s2.name<<"    "<<s2.age<<endl;

        cout<<s1.*pName<<"  "<<s1.*pNum<<endl;//★使用时和对象关联
        cout<<s2.*pName<<"  "<<s2.*pNum<<endl;//★使用时和对象关联
        return 0;
}

//指向类的非静态成员的指针,在定义时必须和类关联,在使用时必须和对相关联的
这里写图片描述


2、指向类的成员函数的指针

//定义+初始化的格式:
数据类型 (类型::*p)(参数列表)=& 类名::非静态函数成员

void (Stu :: *P)() =&Stu::Show; //定义了一个指向Stu类的成员函数的
Show()的指针

通过成员函数指针访问成员函数的格式:

  • (对象.*成员函数指针)()
  • (对象指针->*成员函数指针)()
    class   Stu
{
public:
    string name;
    int age;
    void Show()
    {
        cout<<name<<"  "<<age<<endl; 
    }
} 

例2、代码及运行结果

#include<iostream>
#include <string>
using namespace std;
class Stu
{
public:
    string name;
    int age;
public:
    Stu(string str="wang",int num=18):name(str),age(num)
    {

    }
    void Show()
    {
        cout<<name<<"   "<<age<<endl       ;
    }
};


int main()
{
    Stu s1("Google",1);
    Stu * p = new Stu("ali",14);//在堆内创建一个对象
    void (Stu::*pf)() =&Stu::Show;//定义时和类关联
    (s1.*pf)();//(对象.*成员函数指针)()
    (p->*pf)();//(对象指针->*成员函数指针)()
    return 0;
}

运行结果如下图:
这里写图片描述


3、练习:函数指针数组

#include<iostream>
using namespace std;
class Widget
{
private:
    void a() {cout<<"void a()"<<endl;}
    void b() {cout<<"void b()"<<endl;}
    void c() {cout<<"void c()"<<endl;}
    void d() {cout<<"vodi d()"<<endl;}
    void (Widget::*pa[4])(); //定义了一个函数指针指针数组
public:
    void select(int idx)
    {
        /* *(pa[idx])();*/
        (this->*pa[idx])(); //数组记录的只是偏移量
    }
    Widget() //构造器
    {    //初始化 
        pa[0]=&Widget::a;
        pa[1]=&Widget::b;
        pa[2]=&Widget::c;
        pa[3]=&Widget::d;
    }
};
int main()
{

    Widget A;
    A.select(0);
    A.select(1);
    A.select(2);
    A.select(3);
    return 0;
}

运行结果如下;
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++指向类成员(数据、函数)的指针 的相关文章

  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 高德地图 动态绘制多个路线轨迹

    最近在用高德地图的API 顺便记录下 平时我们只是通过如下代码 给path一串经纬度数组 静态绘制修改路径 但怎么才能通过接收数据 例如Json数据 来动态绘制 多个路径呢 这里有两种方法 设置数据 pathSimplifierIns se
  • 第七章 Logstash深入-收集java日志

    通过Logstash收集java日志并输出到ES中 因为我们现在需要用Logstash收集tomcat日志 所以我们暂时将tomcat安装到Logstash所在机器 也就是db03 10 0 0 53这台机器 收集tomcat访问日志以及t
  • 讲讲如何写论文和发论文(通信类)

    发信人 AWESOME Slavery in Town 信区 GoAbroad 标 题 讲讲如何写论文和发论文 发信站 北邮人论坛 Sun Feb 15 21 22 15 2009 站内 有几个同学发站内信问我如何在本科和硕士期间写论文 发
  • pytest多进程/多线程执行测试用例

    前言 实际项目中的用例数量会非常多 几百上千 如果采用单进程串行执行的话会非常耗费时间 假设每条用例耗时2s 1000条就需要2000s approx 33min 还要加上用例加载 测试前 后置套件等耗时 导致测试执行效率会相对低 想象一下
  • Ubuntu 18.04安装QtCreator+配置qt环境+qtchooser

    文章目录 前言 安装 配置 安装QtCreator 配置Qt环境变量 qtchooser 什么是qtchooser 方法1 方法2 前言 写这个博客的时候 我用了一段时间的QtCreator 感觉良好 足以说是一个很好的C 的IDE了 但是
  • 51单片机中断知识整理

    AT89C51单片机学习整理 一 一 中断结构图 TCON SCON IE IP均为与中断有关的寄存器 IE0 为外部中断INT0的中断标志位 IE1 为外部中断INT1的中断标志位 TF0 为定时器T0的中断标志位 TF1 为定时器T1的
  • window.open()的奇妙冒险

    前言 一个简单的优化需求 竟然引发了window open 的奇妙化学反应 背景 项目X的A页面需要点击一个区域后 跳转到对应的页面B 这个页面需要新开窗口来展示 B页面成功打开后再起接口还在loading的时候关闭 会造成当前浏览器中所有
  • TinyMCE自定义表情包

    记录一次接手别人代码的经历 TinyMCE自定义表情包 那个xxx没做过表情功能 你在xxx项目做过 这个功能你来完成吧 一句简短的话语 开启了改造表情之路 简单了解一下项目 使用的是vue结合TinyMCE富文本 开始造吧 一 效果图 整
  • 164道网络安全工程师面试题(附答案)

    最近有不少小伙伴跑来咨询 想找网络安全工作 应该要怎么进行技术面试准备 工作不到 2 年 想跳槽看下机会 有没有相关的面试题呢 为了更好地帮助大家高薪就业 整理了上百道网络安全工程师面试题 希望它们能够帮助大家在面试中 少走一些弯路 更快拿
  • 金融行业数据模型

    一 Teradata FS LDM Teradata 公司基于金融业务发布的FS LDM Financial Servies Logical Data Model 十大主题 当事人 产品 协议 事件 资产 财务 机构 地域 营销 渠道 1
  • Matlab信号处理,小波降噪

    最近在学小波降噪 分享一些代码帮助大家理解 本文使用matlab进行小波降噪 采用固定阈值方式 对一维噪声数据进行降噪处理 在matlab信号处理书中的一些代码分享一下 信噪比snr为信号与噪声信号的功率比的对数 信号功率计算公式 wden
  • LeetCode题目笔记——448. 找到所有数组中消失的数字

    文章目录 题目描述 题目链接 题目难度 简单 方法一 使用额外空间 字典 代码 Python 代码 C 方法二 进阶 原地修改 代码 C 代码 C 总结 题目描述 这好像是一到经典的面试题 给你一个含 n 个整数的数组 nums 其中 nu
  • matlab实现混沌系统最大李雅普诺夫指数

    李雅普诺夫指数 Lyapunov 是一个较为典型的判断一个系统是否具有混沌特性以及混沌的程度分析方法 李指数 在相空间中初始时无限接近的两个轨道 随着时间的不断推移按指数收敛或发散的平均变化率 它可以定量描述混沌系统在局部范围里系统轨道间的
  • Electron 自定义顶部菜单和上下文菜单

    自定义顶部菜单 文章目录 自定义顶部菜单 1 主进程 2 渲染进程定义顶部菜单 3 实现效果 4 渲染进程定义上下文菜单 5 实现效果 1 主进程 main js 代码如下 示例 main js const electron require
  • 实时分割算法常用思想

    目录 1 替换主网络 2 减少通道数 3 减少卷积层 4 将卷积层替换为组卷积层或其他能减少计算量的卷积操作 5 增加前期数据处理 6 减少复杂的融合方式 7 避免使用全连接 1 替换主网络 将参数量较大的网络替换为参数量小的网络 如 Re
  • qt中new与delete的使用

    qt中有时候使用new后并没有使用delete 原因是 Qt 自动回收是靠父子关系 父亲销毁了 他的孩子也销毁 include mainwindow h include
  • 【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

    前言 注意力机制一直是一个比较热的话题 其实在很早之前就提出了 我们在学习图像分类时在SENet就见到过 直通车 经典神经网络论文超详细解读 七 SENet 注意力机制 学习笔记 翻译 精读 代码复现 自从谷歌发表了 Attention I
  • css 实现汉堡包式菜单

    title css 实现汉堡包式菜单 tags css time 2018 12 01 CSS3 实现汉堡包式菜单 html div class container div
  • 网络安全的规划

    防火墙被应用于内部网与外部网的连接之间 通过2 6 块 100M 快速以太网 卡直接连在 交换机上 使用虚拟网 VLAN 技术 来自 INTERNET 对内部网 12 的访问首先要经过防火墙 防火墙对进出内部网的数据内容进行各个层次的安全
  • C++指向类成员(数据、函数)的指针

    指向 类 的成员的指针包含两种 指向 类 的数据成员的指针 指向 类 的成员函数的指针 注意 指向的是 类的成员 和类发生关系 指向非静态公有数据成员的指针 在定义时必须和类相关联 在使用时必须和对象相关联 1 指向类的数据成员的指针 1