1.常变量:
变量用const修饰,其值不得被改变。任何改变此变量的代码都会产生编译错误。Const加在数据类型前后均可。
void main(void)
{
const int i = 10; //i,j都用作常变量
int const j = 20;
i = 15; //错误,常变量不能改变
j = 25; //错误,常变量不能改变
}
2.常指针:
Const跟指针一起使用的时候有两种方法如下:
-1.const可用来限制指针不可变。也就是说指针指向的内存地址不可变,但可以随意改变该地址指向的内存的内容。
void main(void)
{
char* const str = "Hello, World"; //常指针,指向字符串
*str = ''M''; //可以改变字符串内容
str = "Bye, World"; //错误,如能改变常指针指向的内存地址
}
-2.const也可用来限制指针指向的内存不可变,但指针指向的内存地址可变。
void main(void)
{
const char* str = "Hello, World"; //指针,指向字符串常量
*str = ''M''; //错误,不能改变字符串内容
str = "Bye, World"; //修改指针使其指向另一个字符串
*str = ''M''; //错误,仍不能改变字符串内容
}
-3.这两种方式可以组合起来使用,使指针和内存内容都不可变。
void main(void) { const char* const str = "Hello, World"; //指向字符串常量的常指针 *str = ''M''; //错误,不能改变字符串内容 str = "Bye, World"; //错误,不能改变指针指向的地址 }
3.Const和引用:
引用实际上就是变量的别名,这里有几条规则:
-声明变量时必须初始化
- 一经初始化,引用不能在指向其它变量。
-任何对引用的改变都将改变原变量。
-引用和变量本身指向同一内存地址void main(void) { int i = 10; //i和j是int型变量 int j = 20; int &r = i; //r 是变量i的引用 int &s; //错误,声明引用时必须初始化 i = 15; //i 和 r 都等于15 i++; //i 和 r都等于16 r = 18; //i 和r 都等于18 printf("Address of i=%u, Address of r=%u",&i,&r); //内存地址相同 r = j; //i 和 r都等于20,但r不是j的引用 r++; //i 和 r 都等于21, j 仍等于20 }
4.Const和成员函数
声明成员函数时,末尾加const修饰,表示在成员函数内不得改变该对象的任何数据。这种模式常被用来表示对象数据只读的访问模式。例如:class MyClass { char *str ="Hello, World"; MyClass() { //void constructor } ~MyClass() { //destructor } char ValueAt(int pos) const //const method is an accessor method { if(pos >= 12) return 0; *str = ''M''; //错误,不得修改该对象 return str[pos]; //return the value at position pos } }
5.Const和重载
重载函数的时候也可以使用const,考虑下面的代码:class MyClass { char *str ="Hello, World"; MyClass() { //void constructor } ~MyClass() { //destructor } char ValueAt(int pos) const //const method is an accessor method { if(pos >= 12) return 0; return str[pos]; //return the value at position pos } char& ValueAt(int pos) //通过返回引用设置内存内容 { if(pos >= 12) return NULL; return str[pos]; } }