C ++ 静态存储区+堆空间
静态存储区
特点:
1:生命周期很长,main函数开始之前就存在,main函数结束,才结束
2:同名变量的管理,与栈不一样(重名变量前提,作用域一样):
栈:遇到重名变量,语法错误
静态存储区:遇到重名变量,新声明的变量不再声明,而是直接引用之前声明的那个重名的变量
总结:静态存储区的相同作用域中,出现重名变量,后面变量直接引用前面的
static
延长生命周期:静态局部变量
限制作用域:静态全局变量
作用:将变量声明在静态存储区中
全局变量:
放在静态存储区中
全局变量满足 静态存储区的特点
原全局变量的作用域:程序全局
加static,作用域:当前文件
类的成员属性
静态成员属性,类的所有对象共享,认定为这个类的属性
访问这个属性,用类访问
class Stu,有一个 static string school
Stu::school ;
zs.school ; 编译器优化成Stu::school ;
类的成员方法
加上static,属于类的,通过类来调用,也可通过对象调用
普通和静态 成员函数区别:
1.静态成员函数不会自动入参this指针,没有this指针
2.so静态成员函数里,只能访问静态成员属性,不能访问非静态成员属性
动态内存分配(堆空间)
C++ 为什么不沿用c语言的堆空间
也就是为什么不用 malloc 和 calloc
malloc calloc 只会申请堆空间
不会在堆空间上构建对象 ,仅创建堆空间,不调用构造函数
用堆空间的目的:将一个对象声明在堆空间上,so构造函数必不可少
free 函数也不会调用对象的析构函数
申请 堆空间+调用构造函数: new
new 类名:创建一个对应类大小的堆空间,并在堆空间上调用该类的构造函数
class Stu
Stu* s1 = new Stu 无参构造函数
Stu* s1 = new Stu(参数1) 单参构造函数
Stu* s2 = new Stu(参数1,参数2) 双参构造函数
Stu* arr = new Stu[n] 在堆空间上声明n个对象,形成数组
注意:申请数组的时候,只能调用无参构造函数,无法带参构造函数申请数组
double* b = new double 为普通数据创建堆空间
声明出来的堆空间,没有构造函数可调用,所以没有做初始化,指针指向的地址上是垃圾值同时初始化:
int* a = new int(0) 申请堆空间,并将 *a 初始化0
释放 堆空间:delete
Stu* s = new Stu
delete s 单个堆空间对象
Stu* arr = new Stu[5]
delete[] arr; 释放堆空间数组
malloc/free 和 new/delete 的区别
1:malloc/free 是函数, new/delete 是运算符
2:malloc/free仅申请堆空间,不调用构造函数
new/delete即申请堆空间,又调用构造函数3:malloc申请的堆空间是以字节为单位的,
new申请的堆空间是以数据类型为单位的