C++面向对象的转变 + this指针

概念:

1) this指针(当前类的指针,表示整个类)

C++调用构造函数初始化的时候,相当于C语言的结构体如下:
                                                //这里的const是隐藏的:构造函数规定不能修改地址,否则编译出错
Test(int a, int b)    转换成C语言---> Test(Test *const this, int a, int b)  
{
	this->a = a;      所以this可以直接这样用.(这样也方便区分是当前类的a,还是形参的a)
	this-> b = b;	
}
private:
	int a;  //属性的a
	int b;

扩展:(在类对象中)         同上
Test(int a, int b) const   == Test(const Test *this, int a, int b)  //c++设计者就是这样规定的
在函数中加const修饰符(位置在前面、中间、或者后面都一样),其实修饰的是this指针,表示不能修改指针指向的内存空间。
因为Test在这里是一个类对象,所以整个类的属性都不能修改,a和b都不行。

2)C++类对象中的"成员变量"和"成员函数"是分开存储的

成员变量:
 普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
 静态成员变量:存储于全局数据区中

成员函数:
成员函数存储于代码段中。

问题出来了:很多对象共用一块代码?代码是如何区分具体对象的?

换句话说:int getI() const { return k; },代码是如何区分,具体obj1、obj2、obj3对象的 "i"值?

看下图
在这里插入图片描述

对于普通成员函数,C++编译器做了一层封装,比如Test类的构造函数,其中虽然只写了一个参数i,但实际上就像右面结构体的初始化函数那样,类的构造函数隐藏定义了一个this指针。

而静态成员函数,不需要this指针,因为是共用的,对于类只需要标注作用域就可以了。

所以执行Test a(10); 就相当于 Test a; Test_initialize(&a, 10);其他的类似对比就懂了。

总结:

1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!

2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。

3、静态成员函数、成员变量属于类
31)静态成员函数与普通成员函数的区别
32)静态成员函数不包含指向具体对象的指针
33)普通成员函数包含一个指向具体对象的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值