c++ 重载运算与类型转换

1 基本概念

1.1 基本点

  1. 隐式的this指针
  2. 运算符函数至少有一个类类型参数
  3. 重载运算符的优先级应与内置运算符一致
  4. ::, .*, ., ? : 不可重载


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;
}

  1. 第一个参数为非常量ostream引用
  2. 第二个参数常量引用
  3. 返回ostream型参
  4. 进来减少格式化操作,如换行.

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;
}
  1. 第一个参数非常量istream
  2. 第二个参数非常量对象引用
  3. 错误检测
  4. 返回给定流对象引用

3 算术与关系

  1. 常量引用
  2. 返回一个新对象
  3. 一般定义对应的复合运算,用它来实现该运算.
  4. ==和!=一般成对出现

4 赋值

拷贝赋值, 移动赋值,列表赋值,复合赋值

赋值运算符必须为类成员,复合赋值通常也为成员.这两类都返回左侧对象的引用.

5 下标

  1. 必须为成员
  2. 提供非常量版和常量版

6 递增与递减

  1. 前置和后置成对出现
  2. 返回对象引用
  3. 后置版本先记录对象的状态,再操作,返回记录的对象

7 成员访问

  1. 常量this
  2. * 和 ->成对出现
  3. *返回& , ->返回指针
  4. *先检测是否在作用范围
  5. 箭头运算符必须返回指针或定义了箭头运算符的某个对象
<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 函数调用

  1. 定义了调用运算符的对象,称为函数对象
  2. 可以含有状态数据

8.1 lambda是函数对象


8.2 标准库函数对象


8.3 可调用对象和function

  • c++中的可调用对象: 函数, 函数指针, lambda表达式, bind创建的对象,重载了函数调用运算符的类.
  • 可调用对象也有自己的类型,不同类型可能具有相同的调用形式
  • 标准库function类型--->相同调用形式类型
  • 重载函数的名字不能直接存入function类型的对象.解决方法1, 通过函数指针; 2, lambda


9 类型转换运算符

  1. 必须为成员函数
  2. 无返回值,无参数
  3. 通常是const this
  4. 转换后的类型与函数返回类型要求相同,即不能是数组或函数类型,但可以是它们的指针
  5. 是隐式转换,一般不提供
加explicit变成显示转换,注意在以下条件显示转换将自动变成隐式转换
  1. if, while, do的条件部分
  2. for的条件部分
  3. 逻辑非, 或, 与(!, || , &&)
  4. 条件运算符的条件表达式
例子:IO类istream, ostream

9.1 避免有二义性的类型转换

  1. 实参匹配和相同的类型转换
  2. 转换目标为内置类型的多重类型转换
  3. 重载函数与转换构造函数
  4. 重载函数与用户定义的类型转换

9.2 函数匹配与重载运算符

如果我们对同一个类即提供转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值