c++ 中 operator 使用小结
来源:互联网 发布:女童白色运动鞋淘宝 编辑:程序博客网 时间:2024/06/07 00:18
1、operator作类的转换函数
类可以使用构造函数将其他类型转化为此类的对象,比如
my_class a = my_class(int i);
将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上得到如下的报错信息:
有多个运算符 "<<" 与这些操作数匹配
当然,若同时需要这两个转换函数,这个错误也可以通过很多方法来解决,比如显式的指定要输出的是哪种类型,而不是让编译器自己去选择:
cout << (double)a << endl;
或者指定其中一个转换函数只能显式的转换,而不能隐式的转换
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;}
程序的运行结果:
阅读全文
1 0
- c++ 中 operator 使用小结
- C++中operator new 和 new operator小结以及对new 和 delete初步理解
- operator.c
- C++Operator
- C中Const小结
- C # 中Math 小结
- c#.NET使用小结
- json-C使用小结
- C语言中二维数组做参数的使用小结
- C++中Operator类型强制转换成员函数
- C++中Operator类型强制转换成员函数
- C++中Operator类型强制转换成员函数
- C++中使用<<operator 读取纪录行
- Python中使用operator模块实现对象的多级排序
- Python中使用operator模块实现对象的多级排序
- C + + operator precedence list
- [C++]C++ Operator Precedence
- c语言 cast operator
- JAVA 数据库基础及不同数据库连接代码工具
- python使用sqlite3的例子
- Stirling数概念及例题
- 相对路径与绝对路径
- Python基础总结(4)
- c++ 中 operator 使用小结
- Jfinal 第一天 idea中新建项目
- 常见锁原理和使用-旋转锁和SRWLock
- java使用jbarcode生成条形码2-2
- python中的进程池Pool
- 2017 暑假艾教集训 day10 AC自动机+马拉车+后缀数组 +kmp
- 信息论实验-信源编码算法 (Huffman and Shannonn Fano编码C++实现)
- 旧版本SSL/TLS将被弃用,如何应对?
- c# 线程操作控件