经典问题解析

一、关于const的疑问

 1.const常量的判别准则
     --- 只用用字面量初始化的const常量才会进入符号表
     --- 使用其它变量初始化的const常量仍然是只读变量
     --- 被volatile修饰的const的常量不会进入符号表,只是的得到一个只读变量,而这个只读变量不能出现在赋值符号的左边
  
    注意:在编译期间不能直接确定初始值const标识符,都被作为只读变量处理
 
 2.const引用的类型与初始化变量的类型
        --相同初始化变量称为只读变量
        --不同生成一个新的只读变量
#include<stdio.h>
int main()
{
	
	const int x=1;  //x进入符号表
	
	const int& rx=x; //rx为只读变量,内存空间由编译器为x分配的
	
	int& nrx =const_cast<int&>(rx); //	去掉rx的只读属性
	
	nrx=5;
	
	printf(" x = %d\n",x);
	printf(" rx =%d\n",rx);
	printf("nrx = %d\n",nrx);
	
	printf(" &x = %p\n",&x);
	printf(" &rx =%p\n",&rx);
	printf("&nrx = %p\n",&nrx);
	
	
	volatile const int y =2; //只读变量而不是常量
	
	int* p =const_cast<int*>(&y);
	
	*p =6;
	printf(" y = %d\n",y);
	printf(" &y = %p\n",&y);
	
	const int z=y; //y 只是一个变量,所以z也是只读变量
	 p =const_cast<int*>(&z);
	
	*p =7;
	printf(" z = %d\n",z);
	printf(" &p = %p\n",&p);
	
	/*用不同的变量类型初始化const引用*/
	char c ='c';
	char& rc =c;
	const int& trc = c;
	 
	 rc='a';
	
	printf("  c = %c\n",c);
	printf("  rc = %c\n",rc);
	printf(" trc = %c\n",trc);  //const引用初始变量类型不同,将产生一个新的只读变量
	return 0;
}

二、引用与指针的关系
     1.指针是一个变量
         --值为一个内存地址,不需要初始化,可以保存不同的地址
          --通过指针可以访问对应内存地址中的值
          --指针被const修饰称为常量或者只读变量
      2.引用只是一个变量的新名字
        --对引用的操作(赋值,取地址等)等会传递到代表的变量上
         --const引用使其代表的变量具有只读属性
        --引用必须在定义时初始化,之后无法代表其它变量
      3.从使用C++语言的角度看
          -- 引用指针没有任何关系
          --引用是变量的新名字,操作引用就是操作对应的变量
     4.从C++编译器的角度看
         -- 在编译器内部,使用指针常量来实现“引用”
          --因此 “引用”在定义时必须初始化
    5.c++中不支持引用数组
#include<stdio.h>
int a =1;
struct SV
{
	int &x;
	int &y;
	int &z;
	
};
int main()
{
	int b=2;
	int* pc = new int(3);
	
	//
	//&array[1] - &array[0] = ? 期望是4,实际地址差异很大
	//int& array[]={a,b,*pc};  //报错,因为数组中的每个元素是顺序存放的
	
	SV sv={a,b,*pc};
	/*地址差异很大,因为成员存在的区不一样*/
	printf("&sv.x = %p\n",&sv.x);
	printf("&sv.y = %p\n",&sv.y);
	printf("&sv.z = %p\n",&sv.z);
	
	delete pc;
	return 0;
		
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值