博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++的重载操作符(operator)介绍
阅读量:6955 次
发布时间:2019-06-27

本文共 1992 字,大约阅读时间需要 6 分钟。

hot3.png

1、operator作类的转换函数

类可以使用构造函数将其他类型转化为此类的对象,比如

my_class a = my_class(int i);

1
将int型转化为my_class类的一个对象。

同样,也可以使用类的转换函数将类的对象转化为其他的类型。 

类的转换函数应当满足以下的几个条件:

转换函数必须是类方法

转换函数不能指定返回类型
转换函数不能有参数

下面是一个类转化函数的例子

#include <iostream>

using namespace std;

class my_class

{
public:
    operator int()//定义了一个将类转化为int的转换函数
    {
        cout << "convert_to_int" << endl;
        return 1;
    }
};

int main()

{
    my_class a;
    int i_a = (int)a;//第一次显式的转换
    cout << a << endl;//第二次隐式的转换

    return 0;

}
最终的输出结果如下: 

当然也可以转化为任意其他的类型,只需要改变转换函数即可。

但是在定义转化函数时,要避免出现二义性,比如不要同时提供多个符合条件的转换函数:

#include <iostream>

using namespace std;

class my_class

{
public:
    operator double()//定义了一个将类转化为double的转换函数
    {
        cout << "convert_to_double" << endl;
        return 1.1;
    }

    operator int()//定义了一个将类转化为int的转换函数

    {
        cout << "convert_to_int" << endl;
        return 1;
    }
};

int main()

{
    my_class a;
    cout << a << endl;//报错

    return 0;

}
在VS上得到如下的报错信息:

有多个运算符 "<<" 与这些操作数匹配

1
当然,若同时需要这两个转换函数,这个错误也可以通过很多方法来解决,比如显式的指定要输出的是哪种类型,而不是让编译器自己去选择:

cout << (double)a << endl;

1
或者指定其中一个转换函数只能显式的转换,而不能隐式的转换

explicit operator double()

{
    cout << "convert_to_double" << endl;
    return 1.1;
}
都将得到正确的结果。

2、operator在类中重载运算符

重载与类型转换虽然使用的是同一个关键字,但它们在形式上还是有很大的差别的:

类型转换:operator <类型>()

运算符重载:<类型> operator <运算符>(<参数表>)
重载主要有两种形式,成员函数形式与友元函数形式。下面举个例子:

#include <iostream>

using namespace std;

class MyClass

{
public:
    MyClass() {}
    MyClass(int a, double b):a_(a),b_(b){}
    ~MyClass(){}

    int get_a() { return a_; }

    double get_b() { return b_; }

    MyClass operator+(const MyClass &adder) const//以成员函数方式重载+

    {
        MyClass sum;
        sum.a_ = a_ + adder.a_;
        sum.b_ = b_ + adder.b_;
        return sum;
    }

    friend MyClass operator-(const MyClass &A,const MyClass &B)//以友元方式重载-

    {
        MyClass diff;
        diff.a_ = A.a_ - B.a_;
        diff.b_ = A.b_ - B.b_;
        return diff;
    }

private:

    int a_;
    double b_;
};

int main()
{
    MyClass A(1, 1.1);
    MyClass B(2, 2.2);
    MyClass sum = A + B;
    MyClass diff = A - B;
    cout << sum.get_a() << "\t" << sum.get_b() << endl;
    cout << diff.get_a() << "\t" << diff.get_b() << endl;

    return 0;

}
程序的运行结果: 

 

转载于:https://my.oschina.net/u/920274/blog/3011145

你可能感兴趣的文章
程序员最应该真正读的书籍
查看>>
ubuntu下安装程序的三种方法
查看>>
js之全选即点击全选标签可选择全部复选框
查看>>
自我介绍
查看>>
垂直外边距叠加问题
查看>>
Shell简介:什么是Shell,Shell命令的两种执行方式
查看>>
Linux .bashrc文件设置快速访问快捷键
查看>>
spring多个context:property-placeholder不生效问题
查看>>
入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)...
查看>>
SQL查询
查看>>
四个程序员的一天
查看>>
排序三:插入排序
查看>>
JDBC也就那么回事
查看>>
类的加载顺序 (一、编译时常量与运行时常量)
查看>>
servlet:启动的时机
查看>>
笔记:2016-06-23
查看>>
5.22心得
查看>>
你赚的钱大部分来自你的圈子,而非你的知识
查看>>
字符串递归
查看>>
OS X Yosemite Beta体验
查看>>