【C++】c与c++的const区别,什么是引用,什么是const引用

1.const在c语言和c++中的区别?
例子:

c编译器:
	const int a = 1;
	int* p = &a;
	*p = 2;
	printf("a = %d\n", a);	// a = 2

c++编译器:
	const int a = 1;
	int* p = &a;
	*p = 2;
	printf("a = %d\n", a);	// 编译失败

小结:在c语言中,const是只读变量,会被分配内存空间,可以通过指针改变其值;在c++中,const是真正的常量,会进入符号表,不会被分配内存空间。

2.什么是引用?
1)引用的符号:&
2)引用的作用:起别名
例子:

	int a = 1;
	int& b = a;
	b = 2;
	printf("a = %d\n", a);	// a = 2;

小结:b是a的别名,操作变量b就是操作变量a。

3.什么是const引用?
1)const引用的作用:让变量成为只读变量。
例子:

	int a = 4;
	const int & b = a;	// 让b变为只读变量
	int *p = (int*)&b;	// 通过指针来改变b的值
	*p = 5;
	printf("a = %d,b = %d\n",a,b);				// a = 5,b = 5

4.用常量初始化常引用会分配地址。
例子:


	const int& a = 1;	// 会给a分配内存
	int *p = (int*)&a;	// 通过指针来改变a的值
	*p = 2;
	printf("a = %d,b = %d\n",a,b);				// a = 5,b = 5

5.被volatile修饰的const常量,是只读变量,不会进入符号表,每次访问都从内存中取值。
例子:

	volatile const int m = 10;	// m是只读变量,没有进入符号表。
	int* p = NULL;
	p = const_cast<int*>(&m); 	// 指针p指向m的地址空间
	*p = 20;
	printf("m = %d, *p = %d,  &m = %p, p = %p\n",m, *p, &m, p);
// 结果: m = 20, *p = 20,  &m = 0x7fff470581c8, p = 0x7fff470581c8

6.使用其它变量进行初始化的const常量仍然是只读变量。
例子:

	int m = 1;
	const int z = m;			 // z是只读变量,没有进入符号表。m不是字面量
	int& w = const_cast<int&>(z); 
	w = 30;
	printf("z = %d, w = %d,  &z = %p, &w = %p\n", z, w, &z, &w);
// 结果:z = 30, w = 30,  &z = 0x7fffcc4e5a70, &w = 0x7fffcc4e5a70

7.const引用的类型与初始化变量的类型不同时,生成一个新的只读变量,其初始值与初始化变量相同。
例子:

	char c = 'c';
	char& rc = c;
	const int& trc = c;	// const引用的类型与初始化变量的类型不同
	rc = 't';
	printf("c = %c, rc = %c, trc = %c\n", c, rc, trc);	// c = t, rc = t, trc = c	
// 结果:c = t, rc = t, trc = c

总结:
1.只有用字面量初始化的const常量才会进入符号表;
(1)对const常量进行引用会导致编译器为其分配空间,但是这个空间中的值不会被使用。
(2)1, 2,3.0,‘a’,‘5’等常数和字符都是字面量。

2.使用其它变量进行初始化的const常量仍然是只读变量;

3.被volatile修饰的const常量,是只读变量,不会进入符号表,每次访问都从内存中取值

4.const引用的类型与初始化变量的类型
(1)相同:使初始化变量成为只读变量
(2) 不同:生成一个新的只读变量,其初始值与初始化变量相同

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wolves_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值