1. @ const:
一、对于基本声明
const int r=100;
//标准const变量声明加初始化,编译器经过类型检查后直接用100在编译时替换。
二、对于指针
1.
int x=10;
const int *r=&x;
//指针指向的内容是常量,r指向的内容不能够通过r改变,但如果指向的内容是非const(例如x),内容可以通过自己(x)改变,而且r指针可以改变,可以指向其它的整形.
*r=*r+1; //NO
x++; //YES
r=&y; //YES
2.
int const *r=&x;
//与1完全相同
3.
int * const r=&x;
//指针指向是常量,不能修改去指向其它内容,但指向的内容可以修改
r=&y; NO
*r=*r+1;YES
x++;YES
4.
const int * const r=&x;
//综合1、3用法,r是一个指向常量的常量型指针,指针指向不能改变,指针内容不能改变, 如果指向的内容是非const(例如x),内容可以自身改变
r=&y;NO
*r=*r+1;NO
x++;YES
三、对于类型检查
可以把非const对象赋予const指针,这样就不能改变.但是不能把const赋给非const指针,除非先强制转换
const int x=100;
int *p=(int*)&x;
*p++;
四、对于函数
1.void Fuction1(const int r); //此处为参数传递const值,意义是变量初值不能被函数改变
2.const int Fuction1 (int); //此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。
3.Class CX; //内部有构造函数,声明如CX(int r =0)
CX Fuction1 () { return CX(); }
const CX Fuction2 () { return CX(); }
Fuction1() = CX(1); //没有问题,可以作为左值调用
Fuction2() = CX(1); //编译错误,const返回值禁止作为左值调用。
4.函数中指针的const传递和返回:
int F1 (const char *pstr); //作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值
const char *F2();//意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针
const char * const F3(); //比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。
五、对于类
1.首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如:
X:: X ( int ir ): r(ir) {} //假设r是类X的const成员变量
注意:类的构造和析构函数都不能是const函数。
2.建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。(函数不能修改类的数据成员)
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行++r操作,代码如下
void X::f( ) const
{ (const_cast(this)) -> ++r; } //通过this指针进行类型强制转换实现
C++ const详解
558

被折叠的 条评论
为什么被折叠?



