C++运算符重载总结

1.双目运算符 : 操作数1 运算符 操作数2

 

算术运算符: +,-,*,/,%,后缀++,后缀--
位运算符: ^,&,|,<<,>>
赋值运算符: +=,-=,*=,/=,%=,^=,&=,|=,>>=,<<=
比较运算符: <,>,<=,>=,==,!=
逻辑运算符: &&,||

 

注意:后缀++,后缀--本来应该是单目运算符,
但是为了能够和前缀++,前缀--加以区别,
它也带了一个参数,这个参数必须为int类型。

例如如下代码:

#include<iostream>

using namespace std;

class A
{
public:
    //参数类型只能为int
    void operator ++(int a) { printf("%d\n",a); }    
};

int main()
{
    A a;
    a++;                //隐式调用参数值为0
    a.operator++(25);    //显式调用参数值为25
    return 0;
}

 

作为成员函数:

操作数1是对象本身 ,因此不能是静态成员函数
操作数2为成员函数的参数 ,因此必须有且只有一个参数

 

作为普通函数:

操作数1是参数1
操作数2是参数2

两个参数中至少有一个是类类型

 

2.单目运算符: 运算符 操作数

算术运算符: +,-,前缀++,前缀--
位运算符: ~
逻辑运算符: !
其他运算符: &,*

 

作为成员函数:

操作数是对象本身,因此不能为静态成员函数,且函数不能有参数

 

作为普通函数:

操作数就是参数,因此只能有一个参数,而且必须是类类型

 

3.特殊运算符:

 

1)只能作为普通成员函数重载 =,[],->,()

 

=,[]运算符

性质与上述双目运算符相同,只是不能作为普通函数

 

->运算符

显示调用的时候与普通单目运算符相同。
但是当返回值不是对象指针的时候好像不能够隐式调用。

例如如下代码:

#include<iostream>

using namespace std;

class A
{
public:
    int operator ->() { printf("In A\n"); return 1; }
    int v;
};

class B
{
public:
    A *operator->() {  printf("In B\n"); return &a; }
    A a;
};

int main()
{
    A a;
    B b;
    //a->(); a->;不知道如何隐式调用
    a.operator->();
    b->v;
    return 0;
}

()运算符

参数可以有0个或者任意个参数

 

2)只能作为静态成员函数或者普通函数重载new delete

作为成员函数时,无论加不加static都是静态成员函数

new
返回值必须为void *,第一个参数必须是size_t类型的,可以有任意多个参数

 

delete
返回值必须为void,第一个参数必须是void *,可以有任意多个参数

 

以上内容大部分为VS2010中实践得来,如有不正确的地方欢迎指正。

 

posted on 2013-04-25 22:52  十指之间  阅读(253)  评论(0编辑  收藏  举报

导航