1.const
C++:
在c++中,const定义的是常量,该常量的值是不可以被修改的,编译时期
该使用该常量的地方直接替换成该常量的值,当然,常量是必须初始化的。
因为编译时期,使用该常量的地方必须替换成该常量的值,若没有初始化,
则此常量就是无用的常量
const修饰的数据产生的符号是local的,因为在编译时期就会替换常量的值,
此过程只在本文件中进行,外文件是无法解析此文件的常量
C语言:
在c语言中const定义的是常变量
下面用代码演示一下C和C++在const的区别:
#include<stdio.h>
int main1()
{
const int a = 10;
int *p = &a;
*p = 20;
printf("*p = %d a = %d\n", *p, a); //20 20
return 0;
}
这是在c语言里面定义的常变量,其结果 *p = 20,a = 20;
#include<iostream>
using namespace std;
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 20;
cout << *p << " " << a << endl; //20 10
return 0;
}
这是在C++里面定义的常量,其结果*p = 20;a = 10;在编译时期用到a常量的时候直接替换成10,所以不管如何改变*p的值都不会影响a的值
在编译时期不能确定常量值的时候c++中的常量就会退化成常变量
int c = 20;
const int d = c;//退化成常变量
int *p2 = (int *)&d;
*p2 = 30;
cout << *p2 << " " << d <<" "<<c <<endl; //30 30 20
因为c是变量,所以d的值是无法确定的,所以d退化成了常变量
void fun(const int a) //退化成常变量
{
int *p = (int *)&a;
*p = 30;
cout << *p << " " << a << endl; // 30 30
}
const作为形参也会退化成常变量
int main()
{
fun(10);
return 0;
}
const的基本用法:
const修饰的是离它最近的完整类型
const修饰的内容是它修饰类型的内容
const修饰的内容不容许修改
不允许泄漏常量的地址给非常量的指针
int main()
{
int b = 10;
int *p1 = &b;
const int *p2 = &b;
int *const p3 = &b;
int *q1 = &b;
const int *q2 = &b;
int *const q3 = &b;
q1 = p1; int * -> int * //ok
q1 = p2; const int * -> int * //error 泄漏常量的地址给非常量
q1 = p3; int * const -> int * //ok
q2 = p1; int * -> const int * //ok
q2 = p2; const int * -> const int * //ok
q2 = p3; int * const -> const int * //ok
q3 = p1; //error,
q3 = p2; //error
q3 = p3; //error, p3被const直接修饰,则它的值不允许被修改
return 0;
}
这些基本上就是c和c++关于const区别的用法,望与君共勉……