C++primer阅读笔记-----------重载运算与类型转换

这篇博客详细记录了作者在阅读《C++ Primer》时关于重载运算符和类型转换的重点理解,特别是对于处理混合类型运算的非成员函数重载的深入探讨。
摘要由CSDN通过智能技术生成

该博客用于记录自己在阅读过程中不懂的知识点,很少用到但比较重要的知识点以及模棱两可的知识点


含有混合类型的对称性运算符的重载一般定义为普通非成员函数


string s1 = s + “aa”; //正确
string s1 = “aa” + s; //如果operator+是成员函数则错误,因为此时等价 于“aa”.operator+(s)

输入输出符必须是非成员函数

如果类定义了调用运算符,则称该类对象为函数对象:
class PrintString{
public:
PrintString(ostream &o = cout, char c = ' '):os(o), sep(c){}
void operator() (const string &s) const {os << s << sep}
private:
ostream &os;
char sep;
}
for_each(vs.begin(), vs.end(), PrintString(cerr, '\n'));

标准库定义的函数对象:
sort(vec.begin(), vec.end(), greater<string>());
形如greater<type>这样的函数对象还有许多

可调用对象大致有:函数,函数指针,lamda表达式,bind创建的对象,重载了函数调用运算符的类

使用可调用对象时,不免会考虑如何存放多个相同调用方式的可调用方式,此时为们需要一张函数表,可以用map实现:
map<string, function<int (int, int)>> binops = {
{“+”, add},
{“-”, std::minus<int>()},
//可以存放函数指针,函数对象,lamda表达式等
}
binops[“+”](10, 5); //调用方式

类型转换运算符必须是成员函数,形式:
operator int() const {return val}; //将类类型转换为int类型

显式的类型转换符:
explicit operator int() const {return val};
通常搭配static_cast使用,但有个例外,如果表达式出现在条件中(if,while,for等(有时使用一个输入作为判断条件就是这个原理))或者逻辑运算符以及条件运算符(? :)中,则会忽略explicit,依然执行隐式的类型转换

二异性:
class B;
class A{
A() = default;
A(const B&);
}

class B{
operator A() const;
}
A fun(const A&);
B b;
A a = fun(b); //参数类型为A,可以使用B中的类型转换运算符将b转换为 A类型,也可以使用A中以B类型为参数的构造函数

还有源类型之间可以互相转换的类型转换可能产生二异性
class A{
A (int);
A(double);
}
long num;
A a(num); //二异性错误
同样目标类型也会存在这种隐患



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值