二、面向对象
2.1、类
- 使用struct、class来定义类
- struct和class的区别(唯一区别):struct默认成员变量权限是public,class默认是private;
void test(){};
struct Person{
int age;
void (*run)() = test; //过去的C为了在结构体中使用函数,定义函数指针
}
struct Person{ //不推荐
int age;
void run(){
cout<<"run()->"<<age<<endl;
}
}
class Person{ //推荐使用class
int age;
void run(){
cout<<"run()->"<<age<<endl;
}
}
- 类对象、以及指向对象的类指针的内存都是在函数的栈空间,自动分配和回收的;
2.2、this
- 内存布局:
- 栈区:自动分配回收;创建对象、调用函数会自动分配一段连续栈空间;
- 堆区:需要主动去申请和释放;
- 代码区:用于存放代码;
- 全局区:用于存放全局变量;
- this指针存储了函数调用者的地址,this指针指向了函数调用者;
- 如何用指针间接访问所指向对象的成员变量
- 从指针中取出对象象地址值;
- 用对象地址值+成员变量偏移量计算出成员变量地址;
- 根据成员变量的地址访问成员变量的存储空间
2.3、0xcccccccc
0xcccccccc---->int3:起到断点的作用
初始栈空间填充0xcccccccc,防止函数误跳转到该处执行,如果跳转到该处则会发生中断;
2.4、封装
set、get
2.5、内存空间布局
- 内存布局:
- 栈区:自动分配回收;创建对象、调用函数会自动分配一段连续栈空间;
- 堆区:需要主动去申请和释放;
- 代码区:用于存放代码;
- 全局区:用于存放全局变量;程序运行期间一直存在;
- malloc、free
void test(){
int *p=(int*)malloc(4);
*p=4;
free(p);
}
- new、delete
void test(){
int *p=new int;
*p=4;
delete p;
}
void test1(){
int *p=new int[4];
*p=4;
delete[] p;
}
申请堆空间成功后,会返回那一段内存空间的地址
- 堆空间初始化
void test(){
int size=sizeof(int)*10;
int *p=(int*)malloc(size);
//将p地址开始的连续40个字节的每一个字节都设置为1
memset(p,1,size);
free(p);
}
int *p=new int; //可能未初始化,不同平台不一样
int *p=new int(); //初始化为0
int *p=new int(5); //初始化为5