C++中基于成员函数是否是const重载成员函数
C++pimer中文版第四版 378页 基于const的重载
如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载。比如:
//非const对象可以使用可以使用任意成员,但是下面这个匹配的更好,所以一般用这个成员函数
Screen& display(ostream& os){
os << "something";
return *this;//返回的是普通引用 Screen&, this类型为Screen* const
} //const对象只能使用下面这个const成员函数
const Screen& display(ostream& os) const{
os << "something";
return *this;//返回到额是const引用 const Screen&, this类型为const Screen* const
}
注意上面代码中的this指针的类型:在普通的非const成员函数中,this的类型是一个指向类类型对象的const指针,Screen* const,可以改变this所指向的值,但不能改变this所保存的地址(this的地址就是调用该函数的对象的地址,当然无法改变)。而在const成员函数中,this的类型是一个指向类类型const对象的const指针,const Screen* const,所以既不能改变this所指向对象的值,也不能改变this本身所保存的值(这点是肯定的,刚刚说过)。
由于const成员函数之所以定义成const类型,就是不想改变类对象,所以const成员函数如果返回引用类型(当然,返回非引用类型肯定没问题),只能返回const引用类型,可以返回指向类对象的引用*this,也可以返回指向成员属性的引用(这种情况在《深入探索C++对象模型》第一章有例子)。
《深入探索C++对象模型》第一章 第4页
这个例子中也存在基于成员函数是否是const的重载,两个函数签名相同的成员函数operator[]是重载关系,非const对象调用第一个成员函数,const调用第二个成员函数。
如下:
#include <iostream>
#include <cassert>
using namespace std; template <class type, int dim>
class Point{
public:
Point(){};
Point(type coords[dim]){
for(int index = ; index < dim; ++index){
_coords[index] = coords[index];
}
} //基于成员函数是否是const可以重载成员函数
type& operator[](int index){
assert(index < dim && index >= );
cout << "ordinary fun." << endl;
return _coords[index];
}
const type& operator[](int index) const{
assert(index < dim && index >= );
cout << "const fun." << endl;
return _coords[index];
}
private:
type _coords[dim];
}; template <class type, int dim>
ostream& operator<<(ostream& os, const Point<type, dim>& pt){
os << "(";
for(int i = ; i < dim - ; ++i)
os << pt[i] << ",";
os << pt[dim - ];
os << ")";
return os;
} int main()
{
int a[] = {, , };
Point<int, > point1 = Point<int, >(a);
cout << point1 << endl;
cout << point1[] << endl;
point1[] = ;
cout << point1[] << endl;
return ;
}
C++中基于成员函数是否是const重载成员函数的更多相关文章
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- 【转】C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中 ...
- C++的const类成员函数
转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编 ...
- C++之const类成员变量,const成员函数
const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...
- CPP-基础:非静态成员函数后面加const,以及mutable修饰成员变量
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为 ...
- C++ 函数后加const
1.非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)2.表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, 任意修改它所在的类的成员的操作都是 ...
- static数据成员与const数据成员的定义与初始化
三种数据类型的初始化 1.static int a 的初始化 const int a 的初始化 static const int a的初始化 三种初始化方式 在类外初始化 在构造函数中通过初始化列表初 ...
- OC中修饰符:宏define 常量:const extern
const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * c ...
- C++函数后面加const修饰
声明一个成员函数的时候用const关键字是用来说明这个函数是 "只读(read-only)"函数,也就是说明这个函数不会修改任何数据成员(object). 为了声明一个const成 ...
随机推荐
- Redux和React-Redux的实现(三):中间件的原理和applyMiddleware、Thunk的实现
现在我们的Redux和React-Redux已经基本实现了,在Redux中,触发一个action,reducer立即就能算出相应的state,如果我要过一会才让reducer计算state呢怎么办?也 ...
- sprint2(第六天)
昨天休息一天,今天继续做任务. 燃尽图:
- Scrum立会报告+燃尽图(十二月七日总第三十八次):功能测试
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 树莓派3+rtl8812au开启monitor模式
首先要有一块树莓派,要有一块rtl8812au的网卡. 这个网卡是支持monitor模式的,但是我原来装的驱动驱动在raspbian上开启monitor模式时提示,找不到设备. 然后换了一个驱动 ht ...
- 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程: Java 班级:1352 姓名:黄伟业 学号:20135215 成绩: ...
- Java程序设计基础项目总结报告
Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...
- WebGL学习笔记四点二
前几章对图形图形内部多是 以纯色填充,但是现实中已经有许多好的图片了我们没必要一点点画,这一章第五章就是将图片以纹理的形式加载到片元中,主要过程如下,首先是定义点的坐标的attribute变量用于在j ...
- 笔记之分布式文件系统(DFS)
不知何故,老外都挺喜欢使用DFS,但是国内公司用这个的不多.一个具体的需求就是,备份服务器在国外,所以启用DFS把国内的数据同步一份到国外进行备份.最近有机会接触DFS,把一些心得体会记录一下. 1. ...
- Centos/Fedora下安装Twisted,failed with error code 1 in /tmp/pip-build-H1bj8E/twisted/解决方法
Python踩坑之路 pip/easy_install无法安装Twisted或者安装后无法导入Twisted 看到MM网站上很多图,想用Scrapy框架爬点图,遇到各种库的问题,蛋疼. 一直twist ...
- java 数据结构与算法---栈
原理来自百度百科 一.栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表:它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数 ...