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的区别是什么

  1. new、delete 是运算符,malloc、free是C库函数
  2. new不仅做内存开辟,还可以做内存初始化操作
  3. 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的地址上开辟空间初始化
posted @   霁空  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示