运算符重载为类的成员函数形式:
1,重载为类的成员函数(函数的参数比原来的运算数个数少一个,++,--例外):
函数类型 operator 运算符(形参表){函数体}
2,重载为类的友元函数(参数个数与元运算数的个数相同):
friend 函数类型 operator 运算符(形参表) {函数体}
注: 单目运算符最好重载为成员函数,而双目运算符最好重载为友元函数.
重载单目运算符:
1,重载++,--:
前缀格式: 函数类型 operator ++() {…; return …;} //再查查 ++A
后缀格式: 函数类型 operator ++(int) {…; return …;} //B++
2,重载->单目运算符:“->”运算符是成员访问运算符,只能被重载为成员函数
1,
形式: 数据类型 类名::operator –>();
例子:
#include <iostream>
using namespace std;
class Myclass
{
int n;
public:
Myclass(int x){n=x;}
Myclass *operator ->(){return this;}
void display(){cout<<"N="<<n<<endl;}
};
int main()
{
Myclass s(10);
s->display();
s.display();
return 0;
}
重载双目运算符为成员函数:具有this指针.
Myclass Myclass::operator+(const Myclass &s) //&的含义? { char str[Max]; strcpy(str,name); strcat(str,s.name); return Myclass(str); }
重载双目运算符为友元函数:
无this指针.
格式: friend 类名 operator 运算符(形参1,形参2);
重载比较运算符:
必须返回true(非0)或false(0).
< > ==
格式: bool operator <(const …);
重载赋值运算符:
1,重载运算符”+=”和”-=”:
格式: 类名 operator +=(形参表);
注: 重载运算符运算符”+=”和”-=”不会改变左边变量的值.
2,重载运算符”=”:
系统会自动生成复制对象的的赋值运算符,但其有缺陷,如果对象中有指针,在调用析构函数撤消同一内存会产生运行错误.
“=”运算符重载为成员函数
方式一:
operator =(Myclass &s) { delete p; p=new char[strlen(s.p)+1]; strcpy(p,s.p); }方式二:Myclass &operator =(Myclass &s) { delete p; p=new char[strlen(s.p)+1]; strcpy(p,s.p); return *this; } 当赋值运算符连用时,应使用方式2实现重载.
重载下标运算符:只能作为类的成员函数.可实现数组下标的越界检测等.
格式:返回值类型 operator [](形参表);例子:
char operator [](int n) { if (n>len-1) { cout<<"数组下标越界"; return ' '; //返回一个特殊字符 } else { return *(str+n); } }
重载运算符new和delete:
只能被重载为类的成员函数.无论是否有static关键字,重载了的new和delete均为了的静态成员函数.
new重载格式: void *类名::operator new(size_t,参数表);
delete重载格式: void *类名::operator delete(void *,参数表); //释放空间前需要进行强制类型转换
重载逗号运算符:双目运算符
格式: 类名 operator , (参数表);
重载类型转换运算符:
格式: operator 类型名() {函数体}
重载函数调用运算符:
格式: 数据类型 类名::operator ()(参数表);