1、操作符重载函数的格式是怎么的呢?其实没有固定格式,只要参数个数、类型没有大问题即可,至于返回值其实也无所谓。
2、哪些操作符不能重载?四个:“.”、“::”、“?:”和“sizeof”,记住即可。可以重载的操作符完全可以满足我们的绝大部分需求。
许多重载的操作符都有其特殊要求,这里记录以备忘:
1、->
通过类指针无法访问operator->函数,而是默认的操作。函数原型:
CLASS_NAME[*] operator->(void); // 不一定需要含有*
调用解析规则:
CLASS_NAME object;
object->FuncName();
// 被解析为:
(object.operator->()) 调用 FuncName() // 调用是 -> 或者 . 或者 ::
注意:上一行中的operator->看做是一个函数名称。
注意:一些操作符,如 -> () [],必须通过类的成员函数重载。
实例:
#include <iostream>
using namespace std;
class A
{
public:
A* operator->()
{
cout << "重载了->操作符" << endl;
return this;
}
static void Show()
{
cout << "我是类A" << endl;
}
};
int main(){
A a;
a->Show();
return 0;
}
2、*
函数原型:
CLASS_NAME& operator*();
作为类成员函数时不能带参数哦,要不然就变成乘法运算符的重载了!
3、类型转换操作符
函数原型
operator TYPE_NAME();// 返回值类型必须是TYPE_NAME
实例:
#include <iostream>
using namespace std;
class A
{
public:
void Show(void)
{
cout << "我是类A" << endl;
}
};
class B
{
public:
operator A()
{
cout << "转换发生了" << endl;
return A();
}
};
int main(){
A a = A(B());// 将B类实例转换为A类的实例
a.Show();
return 0;
}
4、函数调用操作符
函数原型
any operator()(...);
实例:
#include <iostream>
using namespace std;
class A
{
public:
void operator()(int i)
{
cout << "输入参数为" << i << endl;
}
};
int main(){
A a;
a(88);
return 0;
}
5、下标操作符
注意点:参数不仅仅可以使index类型的,还能是其他任何类型哦。于是就可以实现一些神奇的语法了,例如字符串作为下标。
实例:
#include <iostream>
using namespace std;
class A
{
public:
int operator[](int index)
{
return index;
}
};
int main(){
A obj;
cout << obj[18] << endl;
return 0;
}
6 、自增操作符++ --
主要是一个左右的问题。左右的写法是不一样的,看下面的例子就懂了:
#include <iostream>
using namespace std;
class A
{
public:
int age;
// ++obj
int operator++()
{
++age;
return age;
}
// obj++
int operator++(int)// 这个参数是什么?求大神解答!
{
int tmp = age;
++age;
return tmp;
}
};
int main(){
A obj;
obj.age = 18;
cout << ++obj << endl;// 此时age从18变成19,应该输出19
cout << obj++ << endl;// 此时age从19变成20,不过应该输出19
return 0;
}
待续。。。
其他操作符 + - * / % 的重载较简单,此处略去。