malloc free #include
new delete key work 关键字 相当于 int for
此两关键字,重点用在类对像的申请与释放。申请的时候会调用构造器完成初始化,释
放的时候,会调用析构器完成内存的清理
开辟单变量地址空间
int *a = new int(5); //开辟大小为 sizeof(int)空间,并初始化为 5
struct Stu
{
int age;
string name;
};
Stu *pstu=new Stu{10,"jake"};//初始化一个结构体
开辟数组空间
一维数组
char *p=new char[40];
strcpy(p,"china");
cout<
多维数组
int(*pa)[4]=new int[3][4]{{0}};
for(int i=0;i
delete /delete[] 用法:
int *p=new int;
delete p;
int *q=new int[100];
delete []q;
int (*qq)[3][4] = new int [2][3][4];
delete []qq;
//c语言版本
int *p=(int*)malloc(100);
if(p == NULL)
return -1;
//C++内存申请失败会抛出异常 异常 一般不用 看看就行
try
{
int *pi=new int[100];
}
catch(const std::bad_alloc e)
{
cout<<"new error"<
C++提供了 inline 关键字,实现了真正的内嵌
宏函数 VS普通函数VS inline 函数
宏函数:
优点:代码内嵌,避免了函数的调用 辟免压栈与出栈的开销
缺点:代码替换,易使生成代码体积变大,易产生逻辑错误,无类型检查
普通函数
优点:一段高度抽象的逻辑,不易产生歧义,使text段体积变小,会进行类型检查
缺点: 函数调用的压栈与出栈的开销
inline
优点:避免调用时的额外开销(入栈与出栈操作)
代价: 由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间。
本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。
适用场景:函数体很“小”,且被“频繁”调用。
类型强转(type cast)
{静态类型转换static_cast,重解释类型转换reinterpret_cast,
( 脱) 常类型转换const_cast,动态类型转换dynamic_cast}
1.静态类型转换static_cast
static_cast<目标类型> (标识符)
在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换
int main(){
int a = 10;
int b = 3;
cout<(b)<
2.重解释类型转换reinterpret_cast
reinterpret_cast<目标类型> (标识符)
对于无隐式的类型转化,static_cast 已不可用
int a[5] = {1,2,3,4,5};
int *q = reinterpret_cast((reinterpret_cast(a) +1));
printf("%x\n",*q);
3.( 脱) 常类型转换const_cast
const_cast<目标类型> (标识符) //目标类类型只能是指针或引用
func( int &s){
cout<(a));
int &ra=const_cast(a);
ra=200;
cout<<"a="<(&a);
*pi=200;
cout<<"a="<(&ad);
pA->data=200;
cout<data<
4.动态类型转换dynamic_cast
dynamic_cast<目标类型> (标识符)用于多态中的父子类之间的强制转化
const与#define
宏是在预处理阶段发生替换 const是在编译阶段发生替换
命名空间(namespace scope)
全局无名命名空间
int v=55;
void func()
{
cout<<"void func()"<
image.png