[C++]const Box * p || Box const * p || Box * const p的区别

来源:互联网 发布:淘宝西铁城手表真假 编辑:程序博客网 时间:2024/05/21 00:46

const与指针结合使用时,容易让人迷惑的是:

1. const到底是限定该指针不可再指向其它内存呢?

2. 还是禁止通过该指针修改其指向的内存块的内容?(PS:这里说的是禁止通过该指针修改内存块,所以不是不能修改,而是要通过其它方式去修改。)


下面来探究一下,先上基础代码。

// Box.h author:sodino@qq.com#ifndef _BOX_H#define _BOX_Hclass Box {public :Box();int volume();void print() const ;void setLength(int) const;void setWidth(int);~Box();private :mutable int length; // mutable:可在const函数中修改int width;int height;};#endif// Box.cpp#include <iostream>#include "Box.h"using namespace std;Box::Box(){length = width = height = 0;cout << "Box " << this << " constructor() executed." << endl;}Box::~Box() {cout << "Box " << this << " deconstructor() executed." << endl;}void Box::setLength(int l) const{length = l;}void Box::setWidth(int w){width = w;}int Box::volume(){return length * width * height;}void Box::print() const {cout << "len=" << length << " width=" << width << " height=" << height << endl;}

以上基础代码。现在来研究一下:

Box * const pBox const * pconst Box * p

这三者的区别。


Box * const p

Box box, bOther; // 这里不需要new即已经初始化了box.print();Box * const p1 = &box;p1 = &bOther; //error: read-only variable is not assignable

代码如上时,根据“error: read-only variable is not assignable”的提示,可以确定const修饰的是其左边的指针,意义为在该指针p1初始化后,禁止再“移情别恋”指向其它地址。



Box const * p

Box box, bOther; // 这里不需要new即已经初始化了box.print();Box const * p1 = &box;p1 = &bOther; // 可以重新指向一个新地址p1->setLength(20);// const修饰的函数,仅可修改mutable的成员变量p1->setWidth(20); // error: member function 'setWidth' not viable:// 'this' argument has type 'const Box', but function is not marked const

代码如上时,发现p1是可以再重新赋值,指向其它内存地址的。但当调用Box的非const函数时,则会提示error。所以确定const修饰意义是禁止通过p1指针修改其指向的内存块的内容。


const Box * p

Box box, bOther; // 这里不需要new即已经初始化了box.print();const Box * p1 = &box;p1 = &bOther; // 可以重新指向一个新地址p1->setLength(20);// const修饰的函数,仅可修改mutable的成员变量p1->setWidth(20); // error: member function 'setWidth' not viable:// 'this' argument has type 'const Box', but function is not marked const

代码如上时,和Box const * p的情形是一致的。

最后,如果是const Box * const p,则即是禁止了指针p指向其它地址,也禁止通过指针p修改其指向的内存块的内容。


总结:

联想到const对成员函数的修饰格式为:

void Box::setLength(int l) const{ // const放在最末length = l;}

const是放在最末的,当const放在函数前头时则是无效的,所以认定为const修饰符对其左边的内容起修饰作用;但当const本身就是最左边的修饰符,那么会对右边的东西起作用。

0 0
原创粉丝点击