c++ const小汇

来源:互联网 发布:windows创建窗口程序 编辑:程序博客网 时间:2024/05/01 01:55

在唐浩强的c++红书里讲了一些const的问题,结合c++primer和网上查到的一些资料,对const进行小汇总。

 

1,定义常变量
c语言里使用预编译进行字符置换(如:#define PI 3.14159),但是这种方法容易出错。c++里提供了const关键字。
例如:const float PI = 3.14159;
普通的常量我们都会弄得清楚,但配合上指针使用呢?
int b = 500;
const int* a = &b; // [a]
int const *a = &b; // [b]
int* const a = &b; // [c]
const int* const a = &b; // [d]
我们可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
那么,[a][b]是相同的,都是指向的内容为常量,这样情况不能对内容进行更改,即*a = 100;会有编译错误。不过,b = 100;仍然是可以的。
[c]是指指针本身是常量,不能被改变。即a = &c;或者a++都会编译出错。
[d]即是前两种情况的结合。它指向的内容和指针本身都不能进行改变。

 

2,修饰参数的const
如 void fun0(const A* a ); void fun1(const A& a);
调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
[注意]:参数const通常用于参数为指针或引用的情况;

 

3, 修饰返回值的const
如const int fun( ); const int* fun( );
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
const int func(); //返回的是常量,所以必须这么调用:cosnt int a=fun();

 

4,定义常对象
在类里,如果定义数据成员为常量,如:const int hour;即为常数据成员。它不能再构造函数里被修改。定义的成员函数为常量,如void get_time() const;即为常成员函数。它只能引用本类中的数据成员而不能修改它们。

如下:

Object const t1或者const Object t1;

表示t1是常对象,其值在任何情况都不能改变。
void Object::func() const;

fun表示Object类的成员函数,可以引用,但不能修改本类的数据成员。
Object * const p;

表示p是指向Object类对象的常指针,p的值(p的指向)不能改变。
const Object *p;

表示p是指向Object类的常对象的指针,其指向的类对象的值不能通过指针来改变。
Object &t1 = t;

表示t1是Object类对象t的引用,t和t1指向同一内存空间。