大二寒假读书笔记150201

来源:互联网 发布:雅顿明星产品知乎 编辑:程序博客网 时间:2024/04/26 04:07

1、指向const对象的指针

目前为止,我们可以使用指针来修改其所指对象的值。但是如果指针指向const对象,那就不能用指针来修改const对象的值。为了保证这个特性,C++强制要求指向const对象的指针也必须具有const特性(有const特性的指针却不是只能指向const对象):

const double pi = 3.14;const double *cptr;double *ptr;ptr = &pi//errorcptr = &pi//ok
这里的cptr是一个指向double类型的const对象的指针,const限定了cptr指针所指向的对象类型,而并没有限制指针本身。如果需要的话,可以给cptr指针重新赋值,使其指向另一个const对象。只是不能通过cptr去修改它所指的对象的内容。

另外不能使用void*指针保存对象的地址,必须使用const void*类型的指针来保存const对象的指针:

const int universe = 42;const void *cpv = &universe;//okvoid *pv = universe;//error
允许把非const对象的地址赋给指向const对象的指针,例如:

double dval = 3.14;cptr = &dval;//ok
虽然dval不是const对象,但cptr一经定义就不允许修改其所指对象的值。因为cptr自以为它是指向的const对象。

重要的是记住:不能保证指向const的指针所指对象的值一定不可修改。

2、const指针

就是说指针是const类型的。指针的值不能修嘎,在定义时就必须初始化,不能再指向其他对象。

int errNumb = 0;int *const curErr = &errNumb;//curErr is a constant pointer
我们可以从右向左的把上述语句读作“cerErr是指向int型对象的const指针”。任何企图给curErr赋值的行为(即使是给curErr赋给相同的值)都会导致编译错误。

指针本身是const对象的事实并没有说明是否能否使用该指针修改它所指向的对象的值。指向const对象的const指针当然不可以修改其对象的值:

const double pi = 3.14;const double *const pi_ptr = π
本例中,既不能修改pi_ptr所指向对象的值,也不允许修改该指针的指向(即pi_ptr中存放的地址值)。可从右向左阅读上述语句:”pi_ptr首先是一个const指针,指向double类型的const对象“。

3、指针和typedef

typedef string *pstring;const pstring cstr;

请问cstr变量是什么类型。const pstring类型的指针。。。。

真实类型呢?当然不是const string *,而是string *const。

typedef不是简单的文本扩展。声明const pstring时,const修饰的是pstring,这是一个指针。因此该声明语句是把cstr定义为指向string类型对象的const指针。

用typedef写const类型定义时,const限定符加在类型名前面容易引起对所定义的真正类型的误解:

string s;typedef string *pstring;const pstring ps1 = &s;pstring const ps2 = &s;string *const ps3 = &s;
上面三种定义是一样的,都是指向string类型的const指针。

其实const限定符放在类型后面更容易理解,从右往左读”ps2是const指针,指向string类型。“

0 0
原创粉丝点击