经典问题解析

经典问题解析,第1张

经典问题解析

一、关于const的疑问

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

二、引用与指针的关系      1.指针是一个变量          --值为一个内存地址,不需要初始化,可以保存不同的地址           --通过指针可以访问对应内存地址中的值           --指针被const修饰称为常量或者只读变量       2.引用只是一个变量的新名字         --对引用的 *** 作(赋值,取地址等)等会传递到代表的变量上          --const引用使其代表的变量具有只读属性         --引用必须在定义时初始化,之后无法代表其它变量       3.从使用C++语言的角度看           -- 引用与指针没有任何关系           --引用是变量的新名字, *** 作引用就是 *** 作对应的变量      4.从C++编译器的角度看          -- 在编译器内部,使用指针常量来实现“引用”           --因此 “引用”在定义时必须初始化     5.c++中不支持引用数组
#include
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 = %pn",&sv.x);
	printf("&sv.y = %pn",&sv.y);
	printf("&sv.z = %pn",&sv.z);
	
	delete pc;
	return 0;
		
}

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5520999.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存