指向类成员的指针并非指针


    对于指向类成员的指针,必须紧记,指向类成员(非static)的指针并非指针。
    1、与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,
而不是指向特定对象里的特定成员。通常最清晰的做法,是将指向数据成员的指针看作为一个偏移量。
这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少个字节。
    2、给定一个成员在类内的偏移量,为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址。这时候就需要 .*和->*的操作。pC->*pimC,请求将pC内的地址加上pimC内的偏移量,为的是访问pC所指向的C对象中适当的数据成员。aC.*pimC,请求aC的地址加上pimC中的偏离量,也是为了访问pC所指向的C对象中适当的数据成员。
Ps:
*成员指针解引用操作符(.*)从对象或引用获取成员
*成员指针箭头操作符(->*)通过对象的指针获取成员
    3、获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。
    4、为了对一个指向成员函数的指针进行解引用,需要一个对象或一个指向对象的指针。对于指向数据成员的指针的情形,为了访问该成员,需要将对象的地址和成员的偏移量相加。对于指向成员函数的指针的情形,需要将对象的地址用作this指针的值,进行函数调用,以及作为其他用途。
    5、一个指向成员函数的指针的实现自身必须存储一些信息,诸如它所指向的成员函数是虚拟的还是非虚拟的,到哪里支找到的适当的虚函数表指针等等。
 
    6、另外补充一点关于指向内联函数的指针的问题。一个函数指针指向内联函数是合法的。然而,通过函数指针调用内联函数将不会导致内联式的函数调用,因为编译器无法在编译期精确地确定将会调用什么函数。因此在调用点,编译器别无他法,只好生成间接、非内联的函数调用代码。

转载于:https://www.cnblogs.com/ljianhui/archive/2012/07/17/2695916.html

指向类成员的指针并非指针相关推荐

  1. 指向类成员函数的指针(学自王桂林)

    指向类成员函数的函数指针数组(实现更隐蔽的接口): 加减乘除: #include<iostream> using namespace std;class Widget {public:Wi ...

  2. 类中成员函数的函数指针定义以及使用

    在algorithm算法中经常会碰到传递函数指针的情况,在这里面他们把这种类型叫做谓词,当然lambda表达式就是 谓词的一种.这次内容要说的当类的成员函数做为谓词时,是什么样子的,如何使用呢? 类中 ...

  3. 指向类成员/函数的指针

    C++扩展了指针在类中的使用,使其可以指向类成员,这种行为是类层面的,而不是对象层面的. 指向类成员/函数的指针的本质并不是取地址.而是利用了对象地址的偏移量 我们创建了一个类,假设我们要使用指针指向 ...

  4. 王桂林讲C++之指向类成员指针

    王桂林讲C++之指向类成员指针 对于普通变量或普通函数,我们可以使用一个指针指向它,然后很方便的通过指针调用它.例如, //变量指针 string str = "china"; s ...

  5. 指向 类成员函数 的 函数指针

    原文:http://www.vckbase.com/document/viewdoc/?id=1818 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以 ...

  6. c++ 表达式必须包含指向类的指针类型_C++:18const关键字(附常量指针、指针常量、常量指针常量)...

    一.const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10; a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10; co ...

  7. 【C++】 指向类的指针 指向类的对象 对象指针 函数指针 引用

    文章目录 C++类的对象和类的指针的区别 指向地址的指针 指针本身的大小 指向数组的指针 指针数组 指向指针数组的指针 多维指针数组 函数参数中使用指针 数组指针传址实现数组求和 函数指针 模仿C++ ...

  8. Golang——指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

    指针: 指针是一个特殊的变量,因为存储的数据不仅仅是一个普通的数据,而是一个变量的内存地址,指针本身也是有内存地址的 指针的数据类型有int.float.bool.string.数组.结构体 指针的作 ...

  9. 前向声明 智能指针_C++ 指针类中实现 -gt;*

    C++ 的裸指针是提供 ->* 的运算符的.但 C++ 智能指针目前是不提供 ->* 的运算符的.因为实现起来比较麻烦,而且没有必要.本文来实现一个,需要用到 C++17. 这篇文章本身在 ...

  10. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

最新文章

  1. 【怎样写代码】工厂三兄弟之工厂方法模式(五):工厂方法模式扩展
  2. 关于“如何破坏单例“我说了好几种方式,面试官却说:我其实随便问问,没想到你真会
  3. navicat premium 链接postgresql 无法加载表_POSTGRESQL 数据库结构体系 ||| 东来西去 三个角度看...
  4. c#中重载单目运算符-_C#程序重载二进制运算符(-,*,/)
  5. 简明Python教程学习笔记_8_异常
  6. Let‘s Fluent:更顺滑的MyBatis
  7. 【java8新特性】——Stream API详解(二)
  8. 陈顺志 php,芦芽山之情
  9. Word英文句子之间空两格的方法,有截图
  10. linux关闭urlhelper服务,ASP.NET MVC UrlHelper.GenerateUrl异常:“无法使用导航..退出顶部目录”...
  11. tableau入门视频笔记(一)
  12. 请问王菲的<流年>歌词的含义
  13. 如何卸载电脑中linux系统软件,Linux下如何卸载软件
  14. Visual Stdio 中的error C2001: 常量中有换行符
  15. html转盘游戏,使用Javascript和CSS3实现一个转盘小游戏(实战篇)
  16. 推荐给互联网人的5个赛道
  17. Word中论文参考文献英文字符间距太大,调整方法。
  18. 帆软相同列合并_合并报表软件有哪些深受欢迎
  19. 2023年,软件测试怎么样?
  20. ZeppelinSpark Zeppelin开发spark

热门文章

  1. Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
  2. BZOJ 1146 网络管理Network(树链剖分+BST)
  3. 实践出真知:微服务经验之避坑指南
  4. nginx limit配置参数解读
  5. (个人)Linux基本指令收集
  6. 微信公众账号开发入门准备
  7. 解方程求PH值,POJ(2006)
  8. 加密--HashPasswordForStoringInConfigFile过时问题
  9. 安装SharePoint2010的准备工作-2
  10. 【Docker】01 Docker概述