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成 ...
随机推荐
- Sqlserver 每日订单半小时数据统计
) '订单数' FROM (SELECT CASE THEN ), create_at, ) ),DATEPART(hh, create_at))+':00:00') ELSE ), create_a ...
- Visual Studio AI配置环境
参考链接:http://www.cnblogs.com/ms-uap/p/9123033.html 背景: 1.能联网的电脑:Win7 64 SP1 2.鼠标.键盘.显示器好使 3.已安装VS2010 ...
- 《UML大战需求分析》-读后感三
用例图是用来描述什么角色通过某某系统能做什么的图,用例图关注的是系统的外在表示想爱你.系统与人的交互系统与其他系统的交互,小人执行者就是角色,角色 是对系统使用者的抽象,一个角色可以代表多个具体的人而 ...
- “吃神么,买神么”的第二个Sprint计划
“吃神么,买神么”的第二个Sprint计划 一.现状 前台布局设计完成一个主页,可以让浏览者了解我们网站的功能,这是第一个阶段的Spring完成的事情.由于没有实际的功能体现,所以第二阶段开始 ...
- 代码上传不到github远程仓库的经历和总结
第二次的作业是分布式版本控制系统Git的安装与使用.一切都好端端地进行,知道最后的上传到给远程仓库时一直都上传失败.舍友也过来调试和助教的指导,依然不成功.我也上网进行了大量的翻查资料也未能成功.这是 ...
- sql中exists和not exists的用法
该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...
- ssh结合使用
springxml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...
- 循环队列的C语言实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构.队列分为链式队列和 ...
- 用css 实现凹陷的线条
box-shadow: 0 1px 0 rgba(255,255,255,0.2) inset,0 -1px 0 rgba(0,0,0,.2) inset; 因为颜色为透明颜色,所以颜色是什么样的,不 ...
- “四则运算生成程序——GUI支持和部分功能改进”链接
项目成员:张金生 张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进