指向类成员函数的指针其实并非指针

1、与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向特定对象里的特定成员。通常最清晰的做法,是将指向数据成员的指针看作为一个偏移量。

这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少个字节。

2、给定一个成员在类内的偏移量,为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址。这时候就需要 .*和->*的操作。pC->*pimC,请求将pC内的地址加上pimC内的偏移量,为的是访问pC所指向的C对象中适当的数据成员。aC.*pimC,请求aC的地址加上pimC中的偏离量,也是为了访问pC所指向的C对象中适当的数据成员。
Ps:
*成员指针解引用操作符(.*)从对象或引用获取成员
*成员指针箭头操作符(->*)通过对象的指针获取成员

3、获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。

4、为了对一个指向成员函数的指针进行解引用,需要一个对象或一个指向对象的指针。对于指向数据成员的指针的情形,为了访问该成员,需要将对象的地址和成员的偏移量相加。对于指向成员函数的指针的情形,需要将对象的地址用作this指针的值,进行函数调用,以及作为其他用途。

5、一个指向成员函数的指针的实现自身必须存储一些信息,诸如它所指向的成员函数是虚拟的还是非虚拟的,到哪里支找到的适当的虚函数表指针等等。

6、另外补充一点关于指向内联函数的指针的问题。一个函数指针指向内联函数是合法的。然而,通过函数指针调用内联函数将不会导致内联式的函数调用,因为编译器无法在编译期精确地确定将会调用什么函数。因此在调用点,编译器别无他法,只好生成间接、非内联的函数调用代码。

(0)

相关推荐

  • C++运算符重载 成员函数与友元函数详解

    复制代码 代码如下: #include<iostream>using namespace std;class A{    int x,y;    public:    A(int xx,int yy):x(xx),y(yy){}    A(){x=0;y=0;}    A operator+(const A&b) //不加const限定,也可以    { return A(x+b.x,y+b.y); }    A operator-()    { return A(-x,-y); } 

  • C++中Operator类型强制转换成员函数解析

    类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换.转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型.转换函数又称类型强制转换成员函数,它是类中的一个非静态成员函数.它的定义格式如下: 复制代码 代码如下: class <类型说明符1> { public: operator <类型说明符2>(); - } 这个转换函数定义了由<类型说明符1>到<类型说明符2

  • operator new在C++中的各种写法总结

    乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次.这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要的,是否能写一个自定义的分配器,某种高级内存管理表或一个特定的垃圾回收机制. 这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述.它面向已经很熟悉C++语言的读者. 原生operator new 我们先从原生operator new开始.考虑如下代码,它用来分配5个int型的空间并

  • C++指向类成员函数的指针详细解析

    首先 函数指针是指向一组同类型的函数的指针:而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数.前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的. 函数指针实例: 复制代码 代码如下: typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int func(int x,int y){ printf("func:x=%d,y=%

  • 全面解析C++中的new,operator new与placement new

    new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只分配所要求的空间,不调用相关对象的构造函数.当无法满足所要求分配的空间时,则        ->如果有new_handler,则调用new_handler,否则        ->如果没要求不

  • 指向类成员函数的指针其实并非指针

    1.与常规指针不同,一个指向成员的指针并不指向一个具体的内存位置,它指向的是一个类的特定成员,而不是指向特定对象里的特定成员.通常最清晰的做法,是将指向数据成员的指针看作为一个偏移量. 这个偏移量告诉你,一个特定成员的位置距离对象的起点有多少个字节. 2.给定一个成员在类内的偏移量,为了访问位于那个偏移量的数据成员,我们需要该类的一个对象的地址.这时候就需要 .*和->*的操作.pC->*pimC,请求将pC内的地址加上pimC内的偏移量,为的是访问pC所指向的C对象中适当的数据成员.aC.*

  • C++普通函数指针与成员函数指针实例解析

    C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.本文即对C++普通函数指针与成员函数指针进行实例解析. 一.普通函数指针 通常我们所说的函数指针指的是指向一般普通函数的指针.和其他指针一样,函数指针指向某种特定类型,所有被同一指针运用的函数必须具有相同的形参类型和返回类型. int (*pf)(int, int); // 声明函数指针 这里,pf指向的函数类型是int (

  • C++ 指向类成员的指针

    前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明.定义以及调用,还有函数指针数组,函数指针用作返回值等.但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010). 指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍: 一.指向类的普通成员的指针(非静态) 1.指向类成员函数的指针 简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配

  • C++指向类成员的指针详解

    目录 一.指向普通变量和函数的指针 二.指向类成员的指针 1.指向类数据成员的指针 2.指向类成员函数的指针 示例 总结 序言:在C++中,可以定义一个指针,使其指向类成员函数或或成员函数,然后通过指针来访问类的成员,这包括指向属性成员的指针和指向成员函数的指针. 一.指向普通变量和函数的指针 指向普通变量的指针 int a=100; int *p = &a; 指向函数的指针(即函数指针) int(*p)(int, int); 这条语句的理解:定义了一个指向函数的指针变量p,首先它是一个指针变量

  • C++编程指向成员的指针以及this指针的基本使用指南

    指向成员的指针 指向成员的指针的声明是指针声明的特例.使用以下序列来声明它们: [storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier] qualified-name ::* [cv-qualifiers] identifier [= & qualified-name :: member-name]; 声明说明符: 可选存储类说明符. 可选 const 和/或 volatile 说明符. 类型说明符:类型的名

  • 深入理解c++常成员函数和常对象

    先明确几个概念: 1. 常对象只能调用常成员函数. 2. 普通对象可以调用全部成员函数. 3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针. 4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针. 5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值: 在X类的const成员函数中,this指针的类

  • C++类中六个默认的成员函数详解

    浅谈 先来说一下"this指针": C++中通过引入this指针解决该问题,暨:C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问,只不过所有的操作对用户是透明的,暨用户不需要来传递,编译器自动完成. 说了这么多其实编译器在生成程序时获取对象首地址的信息.然后将获取的对象的首地址存放在了寄存器中,成员函数的其它参数都是存放在栈中.而this指针参数则是

  • C++类中const修饰的成员函数及日期类小练习

    目录 一.const修饰类的成员函数 1.问题引出: 2.问题分析 3.const修饰类的成员函数 二. 类的两个默认的&运算符重载 三. 日期类小练习 总结 一.const修饰类的成员函数 1.问题引出: 给出一段简单的代码 代码段: #include <iostream> using std::cin; using std::cout; using std::endl; class Date1 { public: Date1(int year = 2000) 类的全缺省构造函数(可

  • 一般函数指针和类的成员函数指针深入解析

    函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样. 1.指向一般函数的指针函数指针的声明中就包括了函数的参数类型.顺序和返回值,只能把相匹配的函数地址赋值给函数指针.为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数.下面是一个指向函数的指针使用的例子. 复制代码

随机推荐