给萌新送福利:关于重载运算符

chen_zhe 沙雕 2020-06-22 19:20:20 2020-06-24 17:17:59 0

最近,liuserojQQ群里有童鞋对重载运算符(operator)感到疑惑,下面由我这个菜鸡解释最最最基础的重载(高级的我也不会)

重载运算符,是指将C++指定的运算符的规则重载,常见的运算符有:+、-、*、/、%、.、&、&&、|、||、^、,、!、(、)、
?:、::,sizeof等;
其中不可以可重载五种的有:?:(条件运算符)、::(域名运算符)、&和*(取地址运算符,&有时也作为位运算符)、sizeof(字节运算符);

运算符重载格式:

运算符返回值类型 operator (参数一,参数二){
    此处相当于函数体;
}

需要注意的是,=(赋值运算)、++(递增运算)、--(递减运算)等属于一元运算符,只能有
一个参数;其他的运算符只能有两个以内参数;一元运算符我只知道放在参数的前面那种
(++和--我不知道哈),当然运算符的参数除了所有内置类型也可以是自定义类型——结构体
(或类),运算符重载一个非常典型的用法就是结构体做加法,代码如下:

    #include <cstdio>
    using namespace std;
    struct point{
        int x;
        int y;
    };
    operator += (point &a,point &b){
        a.x+=b.x,a.y+=b.y;
    }
    point a,b;
    int main(){
        a.x=2,b.x=3,a.y=5,b.y=7;
        a+=b;
        printf("%d %d",a.x,a.y);
    }
下面是一个错误的重载赋值运算符实例:
    #include <cstdio>
    using namespace std;
    struct point{
        int x;
        int y;
    };
    operator = (point &a,point &b){
        a.x=b.x,a.y=b.y;
    }
    point a,b;
    int main(){
        a.x=2,b.x=3,a.y=5,b.y=7;
        a=b;
        printf("%d %d",a.x,a.y);
    }
没错,会CE,那赋值运算符需要赋值和被赋值的两个参数,怎么办?其实一个就够了:

    #include <cstdio>
    using namespace std;
    struct point{
        int x;
        int y;
        operator = (const point a){
            x=a.x,y=a.y;
        }
    };
    point a,b;
    int main(){
        a.x=2,b.x=3,a.y=5,b.y=7;
        a=b;
        printf("%d %d",a.x,a.y);
    }

赋值运算符只需要给数据赋值的那个东东,最好在结构体或类内定义,否则会麻烦一点,类还要     
声明友元(friend)等; 

另外,如何用cout一次性输出结构体呢?

    #include <iostream>
    using namespace std;
    struct point{
        int x;
        int y;
        operator = (const point a){
            x=a.x,y=a.y;
        }
    };
    ostream& operator << (ostream &out,const point &p){
        out<<p.x<<','<<p.y;
        return out;
    }
    point a,b;
    int main(){
        a.x=2,b.x=3,a.y=5,b.y=7;
        a=b;
        cout<<a;
    }
这个了解一下就行了,其实之所以要using namespace std就是因为cout是通过重载<<
运算符来实现输出的(cin也一样),当然cout和cin还有很多成员函数;
不信,你可以把using namespace std;去掉,scanf和printf照样能工作;
c语言没有名为std的命名空间,所以没有cout和cin,也不能重载运算符
说到输入输出,这里提一句,cin和cout之所以慢,是因为他要先把输入输出的数据存到
缓存区,还要自动识别类型;
而scanf和printf还有兄弟:fscanf,fprintf,sscanf,ssprintf,分别用于
读入/输出 文件或字符串,具体请查阅相关资料,这里不赘述了;

    
废话说尽,下面给出重载非运算符为阶乘运算符的代码做个示例:

    #include <iostream>
    using namespace std;
    struct point{
        short x;
    };
    unsigned long long operator !(const point a){
        unsigned long long s=1;
        for(int i=2; i<=a.x; i++) s*=i;
        return s;
    }
    point b;
    int main(){
        b.x=10;
        cout<<!b;
    }

参数不能是原来运算符的参数类型哦!(!应该是个模板类型)

希望对大家有所帮助,蟹蟹!
{{ vote && vote.total.up }}

共 2 条回复

Duke

那个辣鸡人就是我

root 站长

棒~