C和C++的区别三【const的修饰】

C和C++的区别三【const的修饰】


    在C语言中

   1)const修饰的变量称为常变量,在定义时可以进行初始化,也可以不初始化;但是如果在定义时未初始化的情况下,以后都不能在修改了,所在一般在定义时都进行了初始化;

例如:

const int num = 10;
const int b;
b = 20;//error

   2)由于这个常变量本质还是一个变量,所以不可用于数组的下标;

例如:

const int num = 10;
//int array[num] = {0};error

   3)在本文件引用其他文件中的const修饰的量时,跟普通变量一样,只要在本文件中加extern声明一下即可;

   4)由于这个常变量本质还是一个变量,我们可以定义指针通过解引用来改变变量的值;

例如:

int main()
{
	const int a = 10;
	int *p = (int *)&a;
	*p = 20;

	printf("a = %d\n",a);
	printf("*p = %d\n",*p);

	return 0;
}

上述代码图解:

C和C++的区别三【const的修饰】_第1张图片

所以说常变量是一种特殊的变量,它的编译方式和普通变量的编译方式一摸一样,只是常变量不能作为左值而已


在C++中

1)const修饰的变量称为常量,在定义时必须进行初始化,因为在C++的编译规则中,与编译阶段,所有使用常量所在的地方都被替换成它的初始值;

例如:

const int a = 10;
//a = 12;//error;在C++中const一旦初始化后则不能改变
const int s;//在C++中const是常量必须初始化

2)由于本质是一个常量,所以可用于数组的下标;

例如:

const int a = 10;
int arr[a];//合法

3)在本文件引用其他文件中的const修饰的量时,它的作用域为local,本文件所有,所以需要在const常量定义处外加extern,因为在编译时它会直接在文件中展开;

例如:

//test1.cpp文件中
const int baby = 10;
//test2.cpp文件中
extern const int baby;
int main()
{
	const int b = baby;
}

结果:

1>C和C++的区别.obj : error LNK2001: 无法解析的外部符号 "int const baby" (?baby@@3HB)
1>D:\vs练习代码\C++\C++复习\Debug\C++复习.exe : fatal error LNK1120: 1 个无法解析的外部命令

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

::若想使得作用域变为global,则在定义处前加extern,则编译的时候当作global符号进行处理,则其他文件中可用;


4)由于本质是一个常量,我们不可以定义指针通过解引用来改变变量的值;

const int a = 10;
int *p = (int *)&a;
*p = 20;//error

5)引用一个编译阶段不明确的值的时候是常变量            常量-------》常变量;

例如:

int main()
{
	int a = 10;
	const int b = a;
	int *p = (int *)&b;
	*p = 20;
	cout<

结果:

所以说可以被修改,所以这块是常变量;(而不是常量了);


你可能感兴趣的:(C++,C语言)