C++关键字Const的用法小结

来源:互联网 发布:安卓服务器端开发java 编辑:程序博客网 时间:2024/06/03 01:43

   回忆起之前学习的C++内容,发现很多东西都忘光了,看来语言都一样,如果不用的话很快就能忘记。于是开始重拾这个我很感兴趣的语言,于是准备一些专题来进行复习。今天的专题就是Const关键字专题:

1.const变量(const int i)

2.指向常量的指针(const int *pi)

3.指针常量(int *const pi)

4.指向常量的指针常量(const int *const pi)

5.const引用(const int &pi)

 

1.const变量

 定义const变量,因为在被定义以后就不能被修改,所以在定义的时候必须初始化,如:

 const string Hi = "hello world";

 const int i,j = 0;//error,i 没有被初始化

 ps:与其他的变量不同,除特别说明,const变量在定义该变量的文件的局部变量,如果要使const变量能够在其  他文件中被访问,必须显示指定为extern,如:

file.a: extern const string hi = "hello";

file.b: extern const string hi;

         cout<<hi<<endl;

 

2.指向常量的指针

在定义指针的语句的类型前加const,表示指向的对象是常量,如:

const int a = 28;//a 为常量

const int *pi = &a;//pi为指向常量的指针

*pi = 88;//不能通过*pi来修改变量a

a = 88;//a为const变量,不能修改

int a = 38;

const int *pi = &a;//pi为指向常量的指针

*pi = 88;//error,因为pi为const指针,所以不能通过间接访问来修改

a = 88;//ok,因为a不是const类型

//不能把一个const变量的地址赋给一个普通的非const变量指针,如:

const int a = 28;//a为常量

int *pi = &a;//error,a为常量,而pi非const,故初始化错误

//不能使用void *指针保持const变量的地址,而必须使用const void *类型的指针来保存,如:

const int a = 34;

const void * cpv = &a;

void *cpi = &a;//error

3.指针常量

在指针定义语句的指针名前加上const,这样表示指针本身是常量,如:

char *cosnt ptr = "abcd";//指针常量定义

pi = "dcba";//error,pi本身为常量,不能修改

*pi = 'a';//ok,pi所指向的内存单元可以修改

*pi++ = 'b';//error,pi本身不能修改

PS:不能把常量的地址赋给指针常量,如:

 const int a = 45;

 int *const pi = &a;//error,因为*pi是合法的,但a本身不能修改,所以冲突

4.指向常量的指针常量

定义指向常量的指针常量,如:

int ai;

const int ci = 7;

const int *const pi = &ai;

const int *const cpi = &ci;

cpi = &ai;//error,cpi为常量,不能修改

*cpi = 78;//error,cpi所指向的内容是常量,不能修改

ai = 88;//ok

5.const 引用

const 引用是指向常量的引用,如:

const int i = 1024;

const int & j = i;//ok

int &k = i;//error,k为普通引用

tips:

(1)const 引用可以初始化为不同类型的变量或初始化为右值,如:

int i = 42;

const int &r = 42;//初始化为右值

const int &j = r+i;//初始化为不同类型

(2)非const引用却不可如此初始化,如:

int i = 42;

int &j = i;//error,不能初始化为右值

int &k = i+j;//error,不能初始化为不同类型

ps:

double i = 3.1445;

int &j = i;//error,对j的修改不能改变i

小结:非const引用只能与相应的引用类型相绑定,而const引用则可以绑定到不同类型或者右值。

Final PS:

对于tpyedef和指针,如下声明:

typedef string *pstring;

const pstring cstr;

这两句话从表面上理解cstr的真实类型是const string *cstr;但是实际情况并不是这样而应该是string *const cstr;又如下面的声明:

string s;

typedef string *pstring;

const pstring cstr1 = &s;

pstring const cstr2 = &s;

string *const cstr3 = &s;

cstr1,cstr2,cstr3的真实类型均为:string *const指针常量