1.基础知识
C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类。从计算机的角度,程序依然由数据段和代码段构成。
C++编译器如何完成面向对象理论到计算机程序的转化?换句话说,C++编译器是如何管理类、对象、类和对象之间的关系?
2.用内存四区解释C++属性和方法
2.1C++对象中的成员变量和成员函数是分开存储的
成员变量:
- 普通成员变量:存储于对象
中,与struct变量有相同的内存布局和字节对其方式
- 静态成员变量:存储与全局数据区
中
成员函数:存储与代码段
中
2.2C++编译器对普通成员函数的内部处理
提问:很多对象公用一段代码,代码是如何区分具体的对象是谁?
class Person{
private:
int mAge;
public:
Person(int age){
mAge = age;
}
int getAge(){
return mAge;
}
static void prinf(){
prinf("Person static function do something...");
}
};
Person p(20);
p.getAge();
Person::prinf();
比如上面的代码中,getAge()方法如何区分是那个对象调用了自己?
原来C++编译器会将上述代码转成如下形式:
struct Person{
int mAge;
};
void Person_initialize(Person *p, int age){
p->mAge = age;
}
int Person_getMAge(Person *p){
return p->mAge;
}
void Person_prinf(){
prinf("Person static function do something...");
}
Person p;
Person_initialize(&p, 20);
Person_getMAge(&p);
Person_prinf();
其实说到底,是C++编译器帮我们做了一层面向对象的封装
3.总结
- C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型在C++中仍然有效
- C++中类的普通成员函数都隐式包含一个指向当前对象的this指针
- 静态成员函数与普通成员函数的区别:
- 静态成员函数不包含指向具体对象的指针
- 普通成员函数包含一个指向具体对象的指针
- 静态成员函数中不能调用普通成员函数和使用普通成员变量,也就是静态只能使用静态
- 普通成员函数中可以调用静态成员函数和使用静态成员变量