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的地址上开辟空间初始化

浙公网安备 33010602011771号