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

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


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


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); //二异性错误
同样目标类型也会存在这种隐患



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章