const是定义常量 → const意味着只读1:关于前前后后的const
const int a / int const a //代表一个常整形数,不能修改。 如const int a = 10; a = 11;×这是错误的。
const int * b //b是一个指向常整形数的指针,即b所指向的内存数据不能修改,但是它本身可以修改。
int * const c //c是常指针。即指针变量本身不能被修改,但是它所指向的内存空间可以被修改。
const int * const d //d是一个指向常整形的常指针。即指针和它所指向的内存空间均不能被修改。
# include "iostream"
using namespace std;
struct you
{
char name[64];
int age;
};
int you01(const you * pt)
{
//pt->age = 10; //pt是指向常整形数的指针,无法对其指向的内存数据进行修改。
pt = NULL; //但是可以对pt本身进行修改。
return 0;
}
int you02(you * const pt)
{
//pt = NULL; //是常指针,本身不能被修改。
pt->age = 10; //但是pt所指向的内存空间可以被修改。
return 0;
}
int you03(const you * const pt)
{
//pt = NULL; //pt是指向常整形的常指针,本身不能被修改。
//pt->age=10; //pt所指向的内存空间也不能被修改。
printf("age:%d\n", pt->age);
return 0;
}
void main()
{
you y1;
y1.age = 18;
you03(&y1);
}
2:C和C++中的const
C语言中
# include "stdio.h"
void main()
{
const int you = 18;
int * p = NULL;
p = (int *)& you;
* p = 20;
printf("you:%d\n", you);
printf("* p:%d\n",*p);
}
结果
C++中
# include "iostream"
using namespace std;
void main()
{
const int you = 18;
int * p = NULL;
p = (int *)& you;
* p = 20;
printf("you:%d\n", you);
printf("* p:%d\n",*p);
}
结果
可见,C语言中的const是一个“冒牌货”(间接赋值就可以改变),C++中的const才是真正的常量→C++中的const符号表实现机制
3:const 和#define
相同:C++中的const常量类似于宏定义
const int you = 18 ≈ # define you 18
# define me 20
void main()
{
const int you = 18
//const int me = 20;//将这个替换# define me 20也可以
int array[you + me];
}
不同:const常量是由编译器处理的,提供类型检查和作用域检查。
#define 宏定义由预处理器处理,单纯的文本替换。
#include "iostream"
using namespace std;
void fun1()
{
# define a 10
const int b = 20;
}
void fun2()
{
printf("a=%d\n", a); // fun1()中#define定义的a在fun2()中可以使用。
//printf("b=%d\n",b);const提供作用域检查,fun1()中定义的b在fun2()中不能使用。
}
void main()
{
fun1();
fun2();
}
结果