概念:
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)普通成员函数包含一个指向具体对象的指针