本文共 1548 字,大约阅读时间需要 5 分钟。
C++的运算符重载是C++多态的一种表现形式之一,也被称之为运算符函数重载(这是因为C++中可重载的运算符确实有函数名表示法和运算符表示法两种表示方法)。
Test operator+(const Test& t)const{ m_data_int+= t.m_data_int; return *this;}// 使用示例Test t1{99};Test t2{11};Test t3= t1 + t2;Test t4;t4= t1.operator+(t1 + t3);
C++中可重载的运算符重载为数众多,也存在着一些限制,这些限制包括:
1、为防止用户为标准类型重载运算符,重载后的运算符必须至少有一个是用户自 定义类型的数据。
2、不能违反运算符原有的运算规则。
3、不能重载不存在的运算符,即不能创建新的运算符
4、以下运算符不可重载:
sizeof :sizeof运算符
. :成员运算符
.* :成员指针运算符
:: : 域解析运算符
? : 条件运算符
typid : RTTI运算符
const_cast、dynamic_cast、reinterpret_cast、static_cast :强制类型转换
5、只能用作成员函数重载的运算符:
= :赋值运算符
() :函数调用运算符
[] :下标(索引)运算符
-> :通过指针访问类成员的运算符
6、可重载运算符列表
+ | - | * | / | % | ^ |
& | | | ~= | ! | = | < |
> | += | -+ | *= | /= | %= |
^= | &= | |= | << | >> | >>= |
<<= | == | != | <= | >= | && |
|| | ++ | -- | , | ->* | -> |
() | [] | new | delete | new[] | delete[] |
C++中的运算符也可以进行友元重载(运算符重载和运算符函数重载是同意的)。再次举例,如下:
//友元重载的声明friend std::ostream& operator<<(std::ostream& os, const Test& t);//友元重载的定义void operator<<(std::ostream& os, const Test& t){ os<< "当前数据:"<< t.m_data_int<< endl;}
C++的运算符重载可以作为成员函数重载,也可以作为非成员函数(友元)重载,两者之间最重要的区别在于重载函数的参数列表的不同,作为成员函数重载的时候会隐式的传递this指针,而作为非成员函数进行重载的时候需要显式传递。
C++中++、--运算符的重载式很特别的存在,它们有独特的格式,分为前自增(自减)和后自增(自减)。为了编译器能够进行区分,引入了一个额外的int进行区分,但这个int不含有实际意义:
Test& Test::operator++()// 前自增{ ++m_data_int; return *this;}Test Test::operator++()// 后自增,后自增实现一般返回对象,而不是引用{ Test temp= *this; m_data_int++; return temp;}
C++中的转换函数通常很有作用,例如用户封装了一个自己的字符串类型的类(不是库函数中的string类),内部实现使用的是C风格的字符串,那么怎么才能让这个类能够对外提供C风格字符串的操作呢?或许提供一个这样的类型重载(类型转换)是一个很好的选择:
operator char*()const;
转载地址:http://pqmsi.baihongyu.com/