CHAPTER14-重载运算与类型转换(C++ Primer笔记)
14.1 基本概念
- 重载的运算符是具有特殊名字的函数 operator[op_name];包含返回类型、参数列表以及函数体。
- 运算符参数量与其运算对象数量相同。如果一个运算符是成员函数,那么它的第一个运算对象(左侧)绑定到隐式的this指针上。
- 如果重载运算符,它要么是类的成员,要么至少含有一个类类型的参数(无法重载参数全部为内置类型的运算符)
- 不可重载的运算符如下:
:: | .* | . | ? : |
---|
- operator的等价调用
a+b;
operator+(a,b);//非成员运算符,二者等价
a+=b;
a.operator+(b); //成员函数运算符,二者等价
- 一般不重载运算符&& 和 || ,逗号运算符和取地址运算符。
- 重载运算符时最好使用与内置类型一致的含义
- 赋值和复合赋值运算符
- 注意选择重载运算符函数作为类的成员或非成员
14.2 输入和输出运算符
14.2.1 重载输出运算符<<
<< 的第一个形参 一个非常量ostream的引用。
<< 的第二个形参 一个常量的引用,是打印的对象。
注意:
- 输出运算符尽量减少格式化操作:例如换行符
- 输入输出运算符必须是非成员函数。
14.2.2 重载输入运算符 >>
运算符 >>的第一个形参是将要读取的流的引用;
第二个形参是将要读入到非常量对象的引用。
注意:
- 输入运算符需要判断输入是否成功,并处理输入失败的情况
- 可以使用IO标准库来标识错误类型。
14.3 算数和关系运算符
关系运算符最好声明为非成员函数
14.3.1 相等运算符
== and !=
bool operator==(const classType &A, const classType &B){
//compare each member
}
bool operator!=(const classType &A, const classType &B){
//compare each member
}
14.3.2 关系运算符
- 定义顺序关系
- 区分==之外对象之间的关系,通常使用<。
14.4 赋值运算符
类似拷贝赋值运算符和移动赋值运算符,必须声明为成员函数。返回左侧对象的引用。
class A{
A& operator=(/*param list*/){
// ...
return *this;
}
//复合赋值运算符
A& operator+=(const A& rhs){
///...
return *this;
}
};
14.5 下标运算符
表示容器的类通过下标运算符访问元素,operator[]
下标运算符通常返回两个版本:
1.返回普通引用
2.是类的常量成员,返回常量引用
class A{
public:
int& operator[](std::size_t n){return element[n];};
const int& operator[](std::size_t n) const
{return element[n];};
private:
int *elements;
};
14.6 递增和递减运算符
class A{
public:
//前置运算符
A& operator++(){
}; // no params(一元运算符)
A& operator--();//return *this;
//后置运算符
A operator++(int);
A operator--(int);//先存this,然后
};
14.7 成员访问运算符
解引用运算符*
箭头运算符->
string &A::operator*() const{
auto p = check();//
return (*p)[curr];
}
string &A::operator->() const{
return this->operator*();
}
14.8 函数调用运算符
():将对象当作函数使用,函数对象常常可以用作泛型算法的实参,例如for_each(v.begin(),v.end(),printer(cerr,'\n'));
class A{
void operator()(const string &s){
//operations...
}
}
14.8.1 lambda是函数对象
lambda表达式:
在这里插入代码片