C++ this指针详解

this指针:

每个成员函数都有一个隐含的输入参数this指针,this指向当前对象,this指针可以用来访问对象的数据成员。

class B {public:       void fun1() {
       }       void fun() const{
             printf("成员函数地址:%x\n", &B::fun1);
             printf("成员数据x的地址:%x\n", &x);
             printf("成员数据y的地址:%x\n", &y);
             printf("当前对象地址:%x\n", this);
             printf("当前对象的this指针类型:%s\n", typeid(this).name());
             printf("\n");
       }       int x;       int y;
};int main() {
       B b1, b2;       const B b3;
       b1.fun();
       b2.fun();
       b3.fun();
}

结果:

成员函数地址:f8114f
成员数据x的地址:cffd94
成员数据y的地址:cffd98
当前对象地址:cffd94
当前对象的this指针类型:class B const *
 成员函数地址:f8114f
成员数据x的地址:cffd84
成员数据y的地址:cffd88
当前对象地址:cffd84
当前对象的this指针类型:class B const *
 成员函数地址:f8114f
成员数据x的地址:cffd74
成员数据y的地址:cffd78
当前对象地址:cffd74
当前对象的this指针类型:class B const *

结论:成员函数是属于类的,成员数据是属于对象的。

程序修改成:

class B {public:       void fun1() {
       }       void fun() const{
             printf("成员函数地址:%x\n", &B::fun1);
             printf("成员数据x的地址:%x\n", &x);
             printf("成员数据y的地址:%x\n", &y);
             printf("当前对象地址:%x\n", this);
             printf("当前对象的this指针类型:%s\n", typeid(this).name());
             printf("\n");
       }       void fun() {
             printf("成员函数地址:%x\n", &B::fun1);
             printf("成员数据x的地址:%x\n", &x);
             printf("成员数据y的地址:%x\n", &y);
             printf("当前对象地址:%x\n", this);
             printf("当前对象的this指针类型:%s\n", typeid(this).name());
             printf("\n");
       }       int x;       int y;
};int main() {
       B b1, b2;       const B b3;
       b1.fun();
       b2.fun();
       b3.fun();
}

结果:

成员函数地址:931ac8
成员数据x的地址:12ffbb4
成员数据y的地址:12ffbb8
当前对象地址:12ffbb4
当前对象的this指针类型:class B *
 成员函数地址:931ac8
成员数据x的地址:12ffba4
成员数据y的地址:12ffba8
当前对象地址:12ffba4
当前对象的this指针类型:class B *
 成员函数地址:931ac8
成员数据x的地址:12ffb94
成员数据y的地址:12ffb98
当前对象地址:12ffb94
当前对象的this指针类型:class B const *

 结论:当前this指针的类型不仅与对象(const or not)有关,还与对象所调用的成员函数有关。

那么,为什么可以用this指针访问成员函数呢?

class B {public:    void fun1() {
        printf("fun1()\n");
    }    void fun2() {        this->fun1();
    }
};

猜测:每个对象都需要访问成员函数,那么,该对象里一定复制了类的成员函数(应该放在内存的程序段)的地址;既然对象与类有关,那么对象里除了数据成员之外,肯还有其他与类相关的信息。

还有一种可能是,类的成员函数在编译时都修饰成类名有关的名称,这个名称变成了全局唯一的函数名,这些函数都应该放在内存的代码段位置;当对象访问成员函数时,将直接使用修饰过后的名称来调用;而非类的对象调用类的成员函数时,无法使用修饰过的函数名,所以访问出错。这样看来,通过this指针访问成员函数,与直接访问成员函数没有区别,或者说this指针与成员函数没有关系。之所以允许这种写法,是为了让人看上去更直观一些。

static成员函数与this指针:

static成员函数没有默认将this指针参数,所以static成员无法访问对象的数据,只能访问static数据成员。

为什么说this指针不是对象的一部分?this指针所占用的内存不会反应在sizeof的结果中?

this指针是动态构造的,只有在调用非静态成员函数时,才临时构造并传入到成员函数的形参中,调用完毕则被销毁(与形参的属性一致),猜测这就是平时并不占用对象的内存的原因。

虚函数中的this指针:

在虚函数所在类中,有一张虚函数表,而类的对象则有一个虚表指针,指向这张虚表。当虚函数被子类的函数覆盖(重写)时,虚函数表中的相应位置的函数指针将被替换成子类的函数指针。this指针相当于虚表指针?

(0)

相关推荐

  • C语言 const 修饰函数参数 - C语言零基础入门教程

    目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数名后面 二.const 修饰函数参数 1.值传递 2.址传递 ...

  • C 为什么每个对象都有一个虚函数指针?

    首先明确两个概念. ① 虚函数地址存放在虚函数表.多态需要通过虚函数和虚函数表实现. ② 类的对象内部,会有指向类内部的虚表地址指针,这个指针的作用就是调用虚函数.而虚函数的调用,会被编译器转换为对虚 ...

  • const放在函数前后的区别

    一.const修饰指针 int b = 500; 1.const int * a = & b; 2.int const * a = & b; 3.int * const a = &am ...

  • 浅拷贝,深拷贝和写时拷贝(string类)

    浅拷贝浅拷贝:编译器只是直接将指针的值拷贝过来,结果多个对象共用了一块内存,当一个对象调用了析构函数将这块内存释放掉之后,另一些对象不知道这块空间已经还给了系统,再次调用析构函数进行释放时发现已经释放 ...

  • 【原创】C++指针详解

    指针 一,基础知识 1,内存(memory) 电脑是在CPU里面执行任务的,CPU就相当于人的大脑.CPU计算速度很快,所以我们写程序时,哪怕例如执行100多次循环,看起来似乎都是一秒就能执行好的.然 ...

  • C/C 指针详解之基础篇

    目录 一.变量的内存实质到 1.1变量的实质 1.2 赋值给变量 1.3 变量在哪里? 二. 指针是个什么东西? 三. 二级指针(指针的指针) 3.1 定义与初始化 3.2 间接数据访问 3.2.1  ...

  • C/C 指针详解之提高篇

    目录 一. 堆空间与指针的相爱相杀 1.1 堆上一维空间 1.1.1 返回值返回(一级指针) 1.1.2 参数返回(二级指针) 1.2 堆上二维空间 1.2.1 指针作返值输出 1.2.2 空间申请与 ...

  • 详解C语言那些可怕的野指针

    一.什么是野指针? 指针是C语言的灵魂,同时也是很容易让人犯错的重难点,用错了指针将是一个灾难. 指针变量的本质是值,这个特殊的值是一个内存地址值,而合法的内存地址包括定义的变量的地址(栈).mall ...

  • C语言指针用法详解 (三) 二重指针

    二重指针 例子1: Question int **ptr1 = NULL; cout<<"情况一 ptr1=="<<ptr1<<endl; co ...

  • C++中this指针的理解与作用详解

    这篇文章主要给大家介绍了关于C++中this指针的理解与作用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 01 C++ ...

  • 胎元命宫详解

    胎元命宫详解 胎元命宫 8.1 胎元 胎, 指人受精怀胎的月份. 其起法是: 人生月后紧接着这个月的天干与生月后第三个月的地支相配, 就为胎元. 如1998年八月生人, 八月为辛酉, 辛后一干是壬, ...

  • 批八字算婚姻详解

    批八字算婚姻详解 很多人喜欢在孩子一出生的时候就给他们算一下八字,因为他们相信孩子的八字和命运是相对注定了的,通过算命之后可以顺利的避免一些可能在生活中遇到的一些问题和坎坷,也可以顺利度过一些&quo ...

  • 电视选购12个重要参数详解,看完你就是专家,附:爆款推荐

    本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:白云上的鱼 创作立场声明:分享电视选购知识,重要参数详解,轻松搞定电视选购. 目前电视的选择太多太多了,品牌百花齐放琳琅满目,各种高科技加成 ...