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

一、重载运算符由关键字operator和其后要定义的运算符号组成

二、对于二元运算符,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数,除了重载的函数调用运算符operator()外,其他重载运算符不能含有默认实参

三、如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上,因此,成员运算符函数的参数数量比运算符的运算对象总数少一个

四、对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符一致

五、不能被重载的运算符: (::) ( .*) (.) (? :)

六、不应该被重载的运算符: (&&) (||) (,) (&)

七、将运算符定义为成员函数还是普通的非成员函数的选择:

1、赋值(=)、下标([])、调用(())、成员访问箭头(->)运算符必须是成员

2、复合赋值运算符一般应该是成员

3、改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常是成员

4、具有对称性的运算符可能转换任意一端的运算对象,如算术、相等性、关系和位运算符,通常应该是普通的非成员函数

八、在执行输入运算符时可能发生下列错误:

1、当流含有错误类型的数据时读取操作可能失败

2、当读取操作到达文件末尾或遇到输入流的其他错误时会失败

九、如果一个类包含下标运算符,则通常会定义2个版本:一个返回普通引用,1个是类的常量成员并返回常量引用

十、后置递增/递减版本接受一个额外的int类型的形参,用于区分是前置版本还是后置版本

十一、如果类定义了调用运算符,则该类的对象称作函数对象

十二、几种可调用的对象: 函数、函数指针、lamba表达式、bind创建的对象、重载了函数调用运算符的类

十三、调用形式指明了调用返回的类型以及传递给调用的实参类型

十四、函数表通常通过map来实现

十五、转换构造函数和类型转换运算符共同定义了类类型转换: operator type() const, type表示某种类型,类型转换运算符可以面向任意类型,只要该类型能作为函数的返回类型,因此,不允许转换称数组或函数类型,但允许转换称指针或引用类型

十六、因为类型转换运算符是隐式执行的,所以无法给这些函数传递参数,也就不能在类型转换运算符的定义中使用任何形参

 

class StrVec 
{
public:
	// 下标运算符通常定义2个版本,一个返回普通引用,一个是类的常量成员并且返回常量引用
	string& operator[](size_t n) 
	{
		return elements[n];
	}

	const string& operator[](size_t n) const
	{
		return elements[n];
	}

	// 前置运算符
	StrVec& operator++();
	StrVec& operator--();
	// 后置版本通常接受一个额外的int类型的形参,作用是区分前置版本和后置版本
	StrVec& operator++(int);
	StrVec& operator--(int);





private:
	string* elements;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值