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

xiaoxiao2021-02-28  78

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

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

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); //二异性错误 同样目标类型也会存在这种隐患
转载请注明原文地址: https://www.6miu.com/read-54616.html

最新回复(0)