[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
- [C++]const Box * p || Box const * p || Box * const p的区别
- const *p &*const p
- const int *p,int *const p区别
- const int *p,int *const p区别
- const int *p,int *const p区别
- const指针,const int * p, int *const p,int const * p的区别
- const int *p、int *const p、const int* const p的区别
- 题目二:const int *p,const * int p,int const *p的区别还有int const *const p
- (const int *p)、(int const *p)、(int *const p)、(const int *const p)的区别
- int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别
- char *const p;与 const char * p;的区别
- const int *p与int *const p的区别
- const int *p与int *const p的区别
- 编程:char *const p;与 const char * p;的区别
- const char *p与char * const p的区别
- char *const p 与 const char * p 的区别
- const int *p 和 int* const p 的区别详解
- const char *p;与char * const p;的区别
- jsp自定义分页标签
- android:textAppearance 用处
- bzoj3234: [Ahoi2013]立方体 括号法
- Silverlight和浏览器交互介绍----Silverlight中使用托管代码调用JavaScript
- Bootstrap按钮
- [C++]const Box * p || Box const * p || Box * const p的区别
- Mac OS X下进行网络抓包
- Silverlight和浏览器交互介绍-------JavaScript调用托管代码
- C调用python,如何调用pymongo模块
- GridControl详解(一)原汁原味的表格展示
- ScrollView中嵌套两个ListView
- 电子书 Lightweight.Django.2014.11.pdf
- KMP算法伪码
- 三层——WHY