c++ 重载运算与类型转换
2015-07-02 20:57
363 查看
1 基本概念
1.1 基本点
隐式的this指针运算符函数至少有一个类类型参数
重载运算符的优先级应与内置运算符一致
::, .*, ., ? : 不可重载
1.2 重载的运算符函数的调用方式
1) 非成员函数的调用 operator+为对象data1, data2的非成员函数data1 + data2; ==> operator+(data1 , data2);
2) 成员函数的调用 operator+为对象data1的成员函数
data1 + data2 ==> data1.operator+(data2);
1.3 不应该重载的运算符
重载的运算符本质上就是函数调用.1) 运算符的求值顺序无法保留 如: && , || , & , | 等
2) 无法保留运算符的短路求值属性
1.4 使用与内置类型一致的含义
1.5 成员与非成员选择
=, [], (), -> 必须为成员复合赋值一般为成员
改变对象状态或与给定对象密切相关的,通常为成员. 如, ++, -- , * 解引用
具有对称性的运算符, 如算术, 相等性, 关系和位, 通常为非成员.
1) 含对象的混合类型表达式,则运算符必须定义成非成员.
2) 当定义为成员函数时, 左侧运算对象必须是运算符所属类的一个对象.
2 输入与输出
输入输出运算符必须是非成员函数,一般为友元.2.1 <<
ostream & operator<<(ostream &os, const Object &item ){ os<< item.data1<< " "<< item.data2; return os; }
第一个参数为非常量ostream引用
第二个参数常量引用
返回ostream型参
进来减少格式化操作,如换行.
2.2 >>
istream & operator>>(isteam &is, Object &item){ double p; is >> item.data1>>item.data2>>p; if(is){ item.data2 = item.data2 * p; }else{ item = Object();//输入失败:对象被赋予默认状态 } return is; }
第一个参数非常量istream
第二个参数非常量对象引用
错误检测
返回给定流对象引用
3 算术与关系
常量引用返回一个新对象
一般定义对应的复合运算,用它来实现该运算.
==和!=一般成对出现
4 赋值
拷贝赋值, 移动赋值,列表赋值,复合赋值赋值运算符必须为类成员,复合赋值通常也为成员.这两类都返回左侧对象的引用.
5 下标
必须为成员提供非常量版和常量版
6 递增与递减
前置和后置成对出现返回对象引用
后置版本先记录对象的状态,再操作,返回记录的对象
7 成员访问
常量this* 和 ->成对出现
*返回& , ->返回指针
*先检测是否在作用范围
箭头运算符必须返回指针或定义了箭头运算符的某个对象
<span style="font-size:14px;">class StrPtr { public: std::string& operator*() const { auto p = check(curr, "dereference past end"); return (*p)[curr]; } std::string* operator->() const{ return &this->operator*(); } //其他内容 }</span>
8 函数调用
定义了调用运算符的对象,称为函数对象可以含有状态数据
8.1 lambda是函数对象
8.2 标准库函数对象
8.3 可调用对象和function
c++中的可调用对象: 函数, 函数指针, lambda表达式, bind创建的对象,重载了函数调用运算符的类.可调用对象也有自己的类型,不同类型可能具有相同的调用形式
标准库function类型--->相同调用形式类型
重载函数的名字不能直接存入function类型的对象.解决方法1, 通过函数指针; 2, lambda
9 类型转换运算符
必须为成员函数无返回值,无参数
通常是const this
转换后的类型与函数返回类型要求相同,即不能是数组或函数类型,但可以是它们的指针
是隐式转换,一般不提供
加explicit变成显示转换,注意在以下条件显示转换将自动变成隐式转换
if, while, do的条件部分
for的条件部分
逻辑非, 或, 与(!, || , &&)
条件运算符的条件表达式
例子:IO类istream, ostream
9.1 避免有二义性的类型转换
实参匹配和相同的类型转换转换目标为内置类型的多重类型转换
重载函数与转换构造函数
重载函数与用户定义的类型转换
9.2 函数匹配与重载运算符
如果我们对同一个类即提供转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题.相关文章推荐
- 《C++ 沉思录》阅读笔记——句柄类
- 《C++ 沉思录》阅读笔记——代理类
- strcpy/strncpy/strcat/strcmp/strlen函数的c语言实现
- C++之探索多态的本质(虚函数与虚表)2
- C++课程设计:学生成绩管理系统
- Visual C++ Tips: warning C4996: 'stricmp' was declared deprecated
- C++程序设计之四书五经[转自2004程序员杂志]--下篇
- C++程序设计之四书五经[转自2004程序员杂志]--上篇
- Visual C++ Tips: fatal error LNK1276: invalid directive 'ComMode.Obj' found; does not start with '/'
- Qt移动应用开发(六):QML与C++互动
- LeetCode-Largest Number-解题报告
- C++在stack的deque实现
- 【学习笔记】【C语言】条件编译
- 黑马程序员-OC语言-Foundation框架(听课笔记)
- C++ 让程序能够访问名称空间std的方法 以及 main函数头详解
- c++ nullptr关键字
- C++ 获取文件夹下的所有文件名 .
- C++ 沉思录》阅读笔记——类的反思
- 黑马程序员——C语言之数组与冒泡排序
- C++ Vector用法深入剖析