类 this指针 const成员函数 std::string isbn() const {return bookNo;}
转载:http://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html
C++ Primer 第07章 类
7.1.2
Sales_data类的定义如下:
#ifndef SALES_DATA_H#define SALES_DATA_H#include <string>#include <iostream>class Sales_data {public:std::string isbn() const {return bookNo;}Sales_data& combine(const Sales_data&);double avg_price() const;private:- std::string bookNo;
unsigned units_sold = 0;double revenue = 0.0;};Sales_data add(const Sales_data&, const Sales_data&);std::ostream &print(std::ostream&, const Sales_data&);std::istream &read(std::istream&, const Sales_data&);#endif
注意第8行:
std::string isbn() const {return bookNo;}
这里const的作用是修改隐式this指针的类型,默认情况下,this的类型是指向类类型非常量版本的常量指针。例如在Sales_data成员函数中,this的类型是Sales_data *const,即类一旦实例化一个对象后,this指向这个对象,是不能改变的,但是对象本身可以变(通俗的讲,this保存的地址不能变,但是*this指向的内容是可以变的,所以*this是非常量,不可以将this绑定一个常量对象),举个例子:
const int a = 5; //a为整型常量int *const pa = &a; //pa是常量指针,但是*pa可以变,但是a又是常量,所以报错
所以这样就会带来一个问题:我们不能在一个常量对象上调用普通成员函数,测试如下:
去掉const,测试代码如下:
#include "Sales_data.h"int main(){Sales_data data1;std::cout << data1.isbn() << std::endl;return 0;}
结果OK,data1是非常量,调用普通成员函数没有问题,下面做一个改变,将data1声明成常量
#include "Sales_data.h"int main(){const Sales_data data1;std::cout << data1.isbn() << std::endl;return 0;}
CodeBlocks编译报错
error: passing 'const Sales_data' as 'this' argument of 'std::string Sales_data::isbn()' discards qualifiers [-fpermissive]
如果isbn是一个普通函数而this是一个普通指针参数,则我们应该把this声明成const Sales_data *const。毕竟,在isbn的函数体内不会改变this所指向的对象,所以把this设置为指向常量的指针有助于提高函数的灵活性。
然而,this是隐式的并且不会出现在参数列表中,所以在哪儿将this声明成指向常量的指针就成为我们必须面对的问题。C++语言的做法是允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针。像这样使用const的成员函数被称作常量成员函数(const member function)。
可以把isbn的函数体想象成如下形式:
//伪代码,说明隐式的this指针是如何使用的//下面的代码是非法的:因为我们不能显示地定义自己的this指针//谨记此处的this是一个指向常量的指针,因为isbn是一个常量成员std::string Sales_data::isbn(const Sales_data *const this){ return this->isbn; }
因为this是指向常量的指针,所以常量成员函数不能改变调用它的对象的内容。在上例中,isbn可以读取调用它的对象的数据成员,但是不能写入新值。
note:常量对象,以及常量对象的引用或指针都只能调用常量成员函数。
类 this指针 const成员函数 std::string isbn() const {return bookNo;}的更多相关文章
- const成员函数可以将非const指针作为返回值吗?
先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...
- 怎么在const成员函数里面调用非const成员函数?
举个例子: 定义了一个类的const实例,怎么让他也能调用非能调用非const成员函数class foo{public:void test1() {cout << "I am n ...
- 类 this指针 const成员函数
C++ Primer 第07章 类 7.1.2 Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <st ...
- 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...
- C++之const类成员变量,const成员函数
const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- 类的const成员函数,是如何改变const对象的?
我们知道类里面的const的成员函数一般是不允许改变类对象的,但是我们知道const 类型的指针是可以强制类型转出成非const指针的,同样的道理,this指针也可以被强制类型转换 class Y{ ...
- 11、C++之const类成员变量,const成员函数
//转载 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 cons ...
- 【C++】const、volatile不能修饰没有this指针的成员函数
一般所有的成员函数都只有一个复本,当不同的对象调用成员函数时,为了区分是哪个成员在调用,会传入this指针. 当调用有const.volatile修饰的成员函数时,会相应的传入一个const.vola ...
随机推荐
- winform重绘
1.重绘文字#多行文字a.先定义一个矩形 Rectangle p1 = , , , this.Height); Rectangle p2 = , , , this.Height); Rectangle ...
- 如何删除github上项目的文件
1. 你要有前面一章的开发平台和github插件,下面就是基于前面来做的. 如何删掉你github上的文件呢?想必你的电脑有一个下载的git工具了,如果还是没有的话,请用npm下载一个git.这是我已 ...
- Fiddler模拟POST请求
在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“composer”的选项 ...
- 在Terminal中,如何打开Finder,并显示当前的目录
这是一个非常方便实用的小技巧,在Terminal中输入如下命令: $ open . 有图有真相: 参考: Open Finder in Current Folder from Terminal
- 【Codeforces Rockethon 2014】Solutions
转载请注明出处:http://www.cnblogs.com/Delostik/p/3553114.html 目前已有[A B C D E] 例行吐槽:趴桌子上睡着了 [A. Genetic Engi ...
- css--float浮动
前戏 前面我们学习了CSS相关的知识,现在试想一下,如果我们想把两个div放在一行显示,该怎么处理?前面也说过,div是块级标签,默认占一行,这时候如果想要达成效果,那就要用到float了 float ...
- ulimit 值超出允许范围导致无法登陆操作系统
在linux中,使用ulimit可以设置一些资源的使用限制. [root@root ~]# ulimit -a core file size (blocks, -c) unlimit ...
- Dev-Cpp 5.11 c++编译器下载
Dev-Cpp 5.11 c++编译器下载地址: 链接: https://pan.baidu.com/s/1jHMAf1k 密码: i6nw
- web安全--<a>标签带有target=“_blank”
面试时遇到安全相关的一个题目 :超链接<a>标签带有target=“_blank”属性的,容易被利用进行诸如钓鱼等攻击,请问如何在书写代码时进行防范?(谷歌和火狐环境). 自己看到这道题目 ...
- 分享一个C++与Python开发的中小型通用游戏服务端框架(跨平台,开源,适合MMORPG游戏)
在开发一款游戏项目时,在立项时我们往往会考虑或者纠结很多,比如: 1,对于开发来说:服务端和客户端应该选择什么语言?用什么协议通信才更效率?协议后期如何维护?Socket是用长连接还是短连接?TCP还 ...