c++ 重载运算与类型转换

1 基本概念1.1 基本点

1.2 重载的运算符函数的调用方式

1) 非成员函数的调用 operator+为对象data1, data2的非成员函数

data1 + data2; ==> operator+(data1 , data2);

2) 成员函数的调用 operator+为对象data1的成员函数

data1 + data2 ==> data1.operator+(data2);

1.3 不应该重载的运算符

重载的运算符本质上就是函数调用.

1) 运算符的求值顺序无法保留 如: && , || , & , | 等

2) 无法保留运算符的短路求值属性

1.4 使用与内置类型一致的含义

1.5 成员与非成员选择

1) 含对象的混合类型表达式,则运算符必须定义成非成员.

2) 当定义为成员函数时, 左侧运算对象必须是运算符所属类的一个对象.

2 输入与输出

输入输出运算符必须是非成员函数,一般为友元.

2.1 <<ostream & operator<<(ostream &os, const Object &item ){os<< item.data1<< " "<< item.data2;return os;}2.2 >>istream & operator>>(isteam &is, Object &item){double p;is >> item.data1>>item.data2>>p;if(is){item.data2 = item.data2 * p;}else{item = Object();//输入失败:对象被赋予默认状态}return is;}3 算术与关系4 赋值

拷贝赋值, 移动赋值,列表赋值,复合赋值

赋值运算符必须为类成员,复合赋值通常也为成员.这两类都返回左侧对象的引用.

5 下标必须为成员提供非常量版和常量版6 递增与递减7 成员访问

<span style="font-size:14px;">class StrPtr {public:std::string& operator*() const {auto p = check(curr, "dereference past end");return (*p)[curr];}std::string* operator->() const{return &this->operator*();}//其他内容}</span>

8 函数调用定义了调用运算符的对象,称为函数对象可以含有状态数据8.1 lambda是函数对象

8.2 标准库函数对象

8.3 可调用对象和function

9 类型转换运算符

加explicit变成显示转换,注意在以下条件显示转换将自动变成隐式转换

例子:IO类istream, ostream

9.1 避免有二义性的类型转换9.2 函数匹配与重载运算符

如果我们对同一个类即提供转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题.

版权声明:本文为博主原创文章,,未经博主允许不得转载。

三亚呀——赴一个蓝天碧海。只是微笑地固执自己的坚持,

c++ 重载运算与类型转换

相关文章:

你感兴趣的文章:

标签云: