C++:运算符重载

  • 不能被重载的
    • ::
    • .*
    • .
    • ?:
  • 一个运算符函数的成员至少有一个是类类型。
  • 重载运算符本质上是函数调用,运算符的求值顺序无法被保留。&&,||的短路求值属性也无法保留。
  • 应该使用与内置类型一致的含义:
    • 逻辑、关系运算符应返回bool
    • 算数类型返回一个类类型对象
    • 赋值运算符和复合赋值运算符返回对象的引用
  • 重载输入输出运算符>><<
istream& operator>>(istream& is, Foo& foo){
    ...
    return is;
}

ostream& operator<<(ostream& os, const Foo& foo){
    ...
    return os;
}
  • 定义了==,最好也定义!=
  • 当且仅当,<和==产生的结果一致时才定义>运算符
  • 最好定义下标运算符的常量版本和非常量版本,当作用于一个常量对象时,下标运算符返回常量引用。
  • 应同时在类内定义前置和后置++/–
Foo& operator++();  //前置
Foo operator++(int);    //后置版本用(不被使用的)int区分
  • 如果类定义了调用运算符,则该类的对象称作函数对象(function object)
  • lambda是函数对象(一个未命名类的未命名对象),每个lambda有它自己的类型
  • 标准库定义的一组表示算数、关系运算、逻辑运算的类模板 中
    • 算数
    • plus +
    • minus -
    • modulus %
    • multiplies *
    • divides
    • negate
    • 关系
    • equal_to
    • not_equal_to
    • greater
    • greater_equal
    • less
    • less_equal
    • 逻辑
    • logical_and
    • logical_or
    • logical_not
  • 标准库规定的比较函数对象适用与指针,而普通的<不可以(未定义的行为)
  • 函数指针不能指向**调用形式(call signature)**相同的类对象和lambde<- 使用标准库function类型解决中。调用形式相同的可调用对象都可以存。
auto func = [](int a)->int{ return a+1; };
function<int(int)> f;
f = func;
f(10);

重载的函数的二义性可以通过函数指针或lambda表达式来删除

类型转换运算符(conversion operator)

定义了类类型转换->又称用户定义的类型转换

operator type() const;
  • 不声明返回值,参数列表为空
  • 向bool的转换比较普遍
  • 用explicit修饰,禁止隐式的转换
  • 在if,while,for, !, ||, &&, ?: 中显示的转换也被隐式的执行
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绫零依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值