C++C++面向对象高级编程

C++运算符重载-上篇 (Boolan)

2017-02-07  本文已影响146人  Haley_2013

C++运算符重载-上篇 (Boolan)

本章内容:
1. 运算符重载的概述
2. 重载算术运算符
3. 重载按位运算符和二元逻辑运算符
4. 重载插入运算符和提取运算符
5. 重载下标运算符
6. 重载函数调用运算符
7. 重载解除引用运算符
8. 编写转换运算符
9. 重载内存分配和释放运算符

1. 运算符重载的概述

1.1 重载运算符原因

1.2 运算符重载的限制

下面列出重载运算符时不能做的事情:

有一些运算符已经有两种不同的含义。例如,-运算符可以作为二元运算符,如x = y-z;,还可以作为一元运算符,如x = -y;。*运算符可以作乘法操作,也可以用于解除指针的引用。根据上下文的不同,<<可以是插入运算符,也可以是左移运算符。可以重载具有双意义的运算符的两个意义。

1.3 运算符重载的选择

下面几节描述了编写每个重载运算符函数或者方法时需要做出的选择。

(1) 方法还是全局函数

将重载的运算符定义为方法时,如果这个运算符不能修改对象,应该将整个方法标记为const。这样,就可以对const对象调用这个方法。

(2) 选择参数类型
(3) 选择返回类型
(4) 选择行为

1.4 不要重载的运算符

1.5 可重载运算符小结

运算符 名称或类别 方法还是全局friend函数 何时重载 示例原型
operator+ operator- operator* operator/ operator% 二元算术运算符 建议使用全局friend函数 类需要提供这些操作时 friend const T operator+(const T&, const T&); friend T operator+(const T&, const E&);
operator- operator+ operator~ 一元算术运算符和按位运算符 建议使用方法 类需要提供这些操作时 const T operator~() const;
operator++ operator-- 前缀递增运算符和递减运算符 建议使用方法 重载了++和--时 T& operator++();
operator++ operator-- 后缀递增运算符和递减运算符 建议使用方法 重载了++和--时 T operator++(int);
operator= 赋值运算符 必须使用方法 在类中动态分配了内存或资源,或者成员是引用时 T& operator=(const T&);
operator+= operator-= operator*= operator/= operator%= 算术运算符赋值的简写 建议使用方法 重载了二元算术运算符,且类没有设计为不可变时 T& operator+=(const T&); T& operator=(const E&);
operator<< operator>> operator& operator▏ operator^ 二元按位运算符 建议使用全局friend函数 需要提供这些操作时 friend const T operator<<(const T&, const T&); friend T operator<<(const T&, const E&);
operator<<= operator>>= operator&= operator ▏= operator^= 按位运算符赋值的简写 建议使用方法 重载了二元按位运算符,类没有设计为不可变时 T& operator<<=(const T&); T& operator<<=(const E&);
operator< operator> operator<= operator>= operator== operator!= 二元比较运算符 建议使用全局friend函数 需要提供这些操作时 friend bool operator<(const T&, const T&); friend bool operator<(const T&, const E&);
operator++ operator-- I/O流运算符(插入操作和提取操作) 建议使用全局friend函数 需要提供这些操作时 friend ostream& operator<<(ostream&, const T&); friend istream& operator>>(istream&, T&);
operator! 布尔非运算符 建议采用成员函数 很少重载:应该改为bool或void*类型转换 bool operator!() const;
operator&& operator ▏▏ 二元布尔运算符 建议使用全局friend函数 很少重载 friend bool operator&&(const T& lhs, const T& rhs);
operator[] 下标(数组索引)运算符 必须使用方法 需要支持下标访问时 E& operator; const E& operator const;
operator() 函数调用运算符 必须使用方法 需要让对象的行为和函数指针一致时 返回类型和参数可以多种多样,下文有详细讲解
operator type() 转换(或强制类型转换,cast)运算符(每种类型有不同的运算符) 必须使用方法 需要将自己编写的类型转换为其它类型时 operator type() const;
operator new operator new[] 内存分配例程 建议使用方法 需要控制类的内存分配时(很少见) void* operator new(size_t size); void* operator new[](size_t size);
operator delete operator delete[] 内存释放例程 建议使用方法 重载了内存分配例程时 void* operator delete(void* ptr) noexcept; void* operator delete[](void* ptr) noexcept;
operator* operator-> 解除引用运算符 对于operator*,建议使用方法;对于operator->,必须使用方法 适用于智能指针 E& operator() const; E operator->() const;
operator& 取地址运算符 不可用 永远不要 不可用
operator->* 解除引用指针-成员 不可用 永远不要 不可用
operator, 逗号运算符 不可用 永远不要 不可用
operator& 取地址运算符 不可用 永远不要 不可用

表1-1

1.6 右值引用

1.7 关系运算符

2. 重载算术运算符

2.1 重载一元负号和一元正号

2.2 重载递增和递减运算符

3. 重载按位运算符和二元逻辑运算符

4. 重载插入运算符和提取运算符

上一篇下一篇

猜你喜欢

热点阅读