C++ const、引用、new和delete
const
const修饰的变量不能再作为左值,初始化后值不能被修改
C和C++const的区别
C语言中const修饰的值是常变量,不是常量,只是不能作为左值被修改
void main () { const int a = 20; int array[a] = {}; //错误 int * p = (int*)&a; *p = 30; //30 30 30,可以通过指针修改值 printf("%d %d %d",a,*p,*(&a) ); }
C++ const用立即数初始化叫常量,必须初始化,所有出现常量名字的地方都在编译阶段被常量的初始化值替换;若用另一个const初始化则叫常变量与C中相同
int main () { const int a = 20; int * p = (int*)&a; *p = 30; //把a内存对应的值改为30 //20 30 20 printf("%d %d %d",a,*p,*(&a) ); //-> printf("%d %d %d",20,*p,20); } int main () { int b = 20; const int a = b; //这样就退化成了常变量和C中一样 int array[a] = {}; //错误 int * p = (int*)&a; *p = 30; //30 30 30 printf("%d %d %d",a,*p,*(&a) ); }
C++和一级指针的结合
C++中const修饰离他最近的类型,看时把他修饰的类型去掉
const int *p -> const 修饰的int, const *p 即 *p不能再被赋值
int const *p与上面一样因为 *不能单独作为一个类型
int *const p-> const 修饰的 int * ,cont p即p指针指向不能被改变
const int *p = &a; *p = 20; //不行 p = &b; //可以
int *const p =&a; //指针是常量,不能修改指向,但是可以修改指向的值 *p = 20;//YES p = &b;//NO
intconst 类型还是int * ,即const 右边没则const不参与类型
C++和二级指针的结合
const int ** q ,const 修饰的int, const** q 即 **q不能再被赋值
int *const *q ,const 修饰的int *, const * q 即 *q不能再被赋值
int ** const q ,const 修饰的int **, const q 即 q指针指向不能被改变
const和多级指针结合的时候,类型转换一边有const一边没有是不行的
int ** <- const int ** //NO!
const int ** <- int ** //NO!
int ** <- int * const* 相当于 int* <- const int * //NO
int * const * <- int ** 相当于 const int * <- int * //YES
C++引用
定义一个引用变量和定义一个指针变量在汇编上是一模一样的;引用和指针在改变指向内存的值时其汇编指令也时一模一样的
右值引用
右值引用专门引用右值类型,指令上可以自动产生临时量然后之间引用临时量,一个右值引用变量本身是一个左值
int &&c = 20; c = 30; //可以 int &d = 20 //不可以 const int &d = 20; //可以
const 指针引用类型转换的判断->把引用换成指针
int a = 10; const int *p = &a; int *&q = p; //-> int ** q = &p;
new和delete
new和malloc,delete和free的区别是什么
- new、delete 是运算符,malloc、free是C库函数
- new不仅做内存开辟,还可以做内存初始化操作
- malloc开辟内存失败,由返回值和nullptr比较;new则会抛出bad_alloc类型的异常
int *q = new int[20](); //20个int大小的空间,初始化为0 delete q[ ];
new有多少种
4种
int *p1 = new int (20); int *p2 = new (nothrow) int; const int *p3 = new const int(40); //定位new int data = 0; int *p4 = new (&data) int (50);//在data的地址上开辟空间初始化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)