C++中对于const进一步学习

//C++中 const 的表现

struct Teacher {
	char name[64];
	int age;
};
//结构体变量是对象的时候用.,结构体变量是指针的时候用->;
int operatorTeacher01(const Teacher *Pt){
	//Pt->age = 10;//不通过---指向的内存空间里的东西不能被修改
	  return 0;
}

int operatorTeacher02(Teacher *const Pt) {
	Pt->age = 10;//pt指向的内存空间里的东西可以修改
	//本身不能修改
	//Pt = NULL;//本身不能修改
	return 0;
}


int operatorTeacher03(const Teacher *const Pt) {
	//Pt->age = 10;//pt指向的内存空间里的东西可以修改
				 //本身不能修改
	//Pt = NULL;//本身不能修改
	//都不能被修改,只能被调用(使用);
	cout << "age:" << Pt->age << endl;
	return 0;
}

int main()
{
	
	const int a=0;
	int const b=0;    		//第一种 第二种写法都是一样的
	const int *c;			
	//const修饰的是指针所指向的内存空间--所指向内存空间里的东西不能被修改;
	int *const c = 0;		
	//const修饰的是指针变量本身--原定指向哪个内存空间就是哪个,不能被更改;
	const int * const e=0;	
	//本身和指向的内存空间都不能修改--指向内存空间里的东西不能被更改,原定指向哪个内存空间也不能被更改;
	Teacher t1;
	t1.age = 33;
	operatorTeacher03(&t1);
	return 0;
}

//const 的好处,指针作为函数参数时,增加代码的可读性,减少bug;
//清楚的区分指针是 输入 还是 输出 的特性;
------01_笔记*/

//1.发现问题:C 中的 const 可以被间接赋值:
/*
------     有代码如下:

#include<stdio.h>
int main()
{	
	const int a=10;
	int *p;
	p=(int *)&a;

	*p=20;

	printf("a:%d \n",a);
	return 0;
}

输出为: a: 20;
说明C语言中的const是一个冒牌货,可以通过指针间接赋值来修改const的值
而在:C++ 编译器中则不会发现这样的情况:
输出还是: a:10;
//所以,在C++语言中,const是一个真正的常量

//2.上述问题的原因:
C++编译器中有符号表这个机制
C++编译器对const做了加强;符号表存放const变量
当使用这个const值时,C++编译器会调出这个值;
当取这个const变量的地址时,C++编译器会为这个变量再开辟一个地址,而且所指向的地址不再是原变量的首地址,而是这个开辟的新地址。

#include<stdio.h>
int main()
{
const int a=10;
int *p;
p=(int *)&a;

*p=20;

printf("a:%d \n",a);
printf("*p:%d \n",*p);
return 0;
}

结论:
C语言中:
    const是只读变量,有自己的存储空间;

C++语言中:
    const变量可能被分配空间,也可能不分配空间;
    当取地址符号&操作时,分配存储空间;
    当const变量作为全局变量时,并且在其他文件中使用时,才分配内存空间;
 


//3.给const变量分配内存的时机,是在编译时分配内存,还是在执行时?
答:在编译时,扫描到这个变量,就给他分配了内存。

int main()
{
	int a;
	const int b=0;
	int c;
	printf("&a:%d ,&b:%d ,&c:%d",&a,&b,&c);	//依次将a,b,c压栈进入内存,b处于a、c之间
	*p=20;
	return 0;
}

//4. const的用法:
// const 是C++ 中用来替换#define的一个手段;
//与#define的相同之处:

int main()
{
	int a=10;
	int b=20;
	int Arry[a+b];   
	//这种在C++编译器中是不通过的---在linux内核中是成立的--linux的gcc编译器是支持的--win的C和C++都不支持
}
int main()
{
	const int a=10;
	const int b=20;
	int Arry[a+b];
	//这种是可以通过编译的
	return 0;
}

*/
//const 与 #define 的不同之处:
//#define 在编译预处理阶段处理
//const   常量是由编译器处理的,提供类型检查和作用域检查;
/*

void fun1()
{
    #define a 10
    const int b = 20;
    //#undef a  //卸载宏定义:# undef
}

void fun2()
{
    printf("a = %d\n", a);
    printf("b = %d\n", b);// const定义的b是由作用域的
}

int main()
{
    fun1();
    fun2();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/81205163