#include <iostream>
using namespace std;
struct Person {
int m_age;
void run() { // 函数的代码都在代码区
cout << "Person::run() - " << m_age << endl;
}
};
int main() { // 函数的代码都在代码区
Person person1; //局部变量,栈空间
person1.m_age = 10;
person1.run();
Person person2; //局部变量,栈空间
person2.m_age = 20;
person2.run();
getchar();
return 0;
}
- 栈空间、堆空间、代码区、全局区
this 存函数调用者的地址,指向了函数调用者
void run() { //隐式参数,this偷偷给函数传了一个指针地址的参数
cout << "person::run() - " << this->m_age << endl; //谁调用run()函数,this就访问谁
}
person1.run();
// this = &person1 this存的是&person1的指针
- 堆空间只能用指针
- 函数栈空间先用cc填充
cc ->int3 起到断点的作用
封装
- 成员变量私有化,提供getter和setter给外界去访问成员变量
struct Preson {
private:
int m_age;
public:
void setAge(int age){
if (age <=0 ) {
m_age = 1;
} else {
m_age = age;
}
}
int getAge() {
return m_age;
}
};
int main() {
Preson person;
person.setAge(-4);
cout << person.getAge() << endl;
//person.m_age = 4;
}
内存空间的布局
- 每个应用都有自己独立的内存空间
- 代码段(代码区):用于存放代码,只读
- 数据段(全局区):放全局变量,整个程序运行过程中都在
- 栈空间:每调用一个函数就分配一段连续的空间,调用完毕后自动回收
- 堆空间:需主动申请和释放
堆空间
在程序运行过程,为了能自由控制内存的生命周期、大小,会经常使用堆空间的内存- 相声版解释:你还有100的血,被一个技能打中损失了99的血。内存怎么能把你给回收了呢?需要精准的计算以后来控制内存啥时候把你释放掉。你死了以后总要复活继续推搭吧?需要精准计算倒计时来想内存申请空间,大小。100的血,总不能乱分配你10000的血吧。
- 堆空间的申请、释放。malloc、free(C语言方式)
- C++堆空间申请、释放:new、delete
int *p = (int *) malloc(4); //堆空间申请4个字节,会返回申请空间的首地址
*p = 10; //拿到堆空间的首地址后,把10放进去
void test() { //函数执行结束后,回收栈空间;堆空间是永远不会回收的
int *p = (int *) malloc(4);
*P = 10;
free(p); //把堆空间地址值放进去,就会回收掉
}
int age = 10; //栈空间申请4个字节
c++申请方式
int *p = new int;
*p = 10;
delete p;
char *p = new char;
*p = 10;
delete p;
char *p = new char[4];
*p = 10;
delete[] p;
堆空间的初始化
int size = sizeof(int) * 10;
int *p = (int *) malloc(size);
// memory set 给个地址,初始化为多少,多少字节
memset(p, 0, size);
int *p = new int(); //被初始化为0
int *p = new int(1); //被初始化为1
对象的内存
- 全局区(数据段):全局变量
- 栈空间:函数里面的局部变量
- 堆空间:malloc、new等