C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。

类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。

对 double 类型强制转换运算符进行了重载。

#include <iostream>
using namespace std;
class Complex
{double real, imag;
public:Complex(double r = 0, double i = 0) :real(r), imag(i) {};operator double() { return real; }  //重载强制类型转换运算符 double
};
int main()
{Complex c(1.2, 3.4);cout << (double)c << endl;  //输出 1.2double n = 2 + c;  //等价于 double n = 2 + c. operator double()cout << n;  //输出 3.2
}

程序的输出结果是:

1.2
3.2

第 8 行对 double 运算符进行了重载。重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是确定的,就是运算符本身代表的类型,在这里就是 double。

重载后的效果是,第 13 行的(double)c等价于c.operator double()。

有了对 double 运算符的重载,在本该出现 double 类型的变量或常量的地方,如果出现了一个 Complex 类型的对象,那么该对象的 operator double 成员函数就会被调用,然后取其返回值使用。

第 14 行,编译器认为本行中c这个位置如果出现的是 double 类型的数据,就能够解释得通,而 Complex 类正好重载了 double 运算符,因而本行就等价于:

double n = 2 + c.operator double();

C++ 重载强制类型转换运算符相关推荐

  1. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  2. 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值

    这三个名字可能很绕,看着也很不一样,但其实是三个很容易混淆的概念,并且经常在实际编程中遇到.这里拿出来比较一下. 首先是强制类型转换运算符的重载,作用是当前对象向其他类型的转换,常见的形式是 oper ...

  3. C++ 强制类型转换运算符

    C++ 将类型名作为强制类型转换运算符. C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:static_cast.reinterpret_cast.const_cast 和 dyna ...

  4. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)

    十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...

  5. c语言运算符类型转换,C语言中强制类型转换运算符的独特作用

    C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...

  6. 强制类型转换运算符的优先级

    强制类型转换 int i=10; char b=20; 如:i=b;//这样赋值没有问题,因为低字节类型转换成高字节类型. 如果是b=i;//这样会有问题,b=(char)i;//因为高字体转换为低字 ...

  7. c++强制类型转换运算符

    static_cast •用于非多态类型的转换 •不执行运行时类型检查(转换安全性不如 dynamic_cast) •通常用于转换数值数据类型(如 float -> int) •可以在整个类层次 ...

  8. c语言--强制类型转换运算符

    当我们想改变一个表达式的类型时,"强制类型转换符",get it! 1.一般形式: (类型名)(表达式) 2.一般应用: (float) x                     ...

  9. 强制类型转换运算符—C++基础篇

    VC++中的四种强制转换类型运算符,const_cast,reinterpret_cast,static_cast,dynamic_cast 1, static_cast<T*>(a)  ...

最新文章

  1. 张宏江对话清华“智班”:我想看到更多极客
  2. plsql配置远程连接数据库
  3. linux dd 大文件下载,Linux dd+grep 大文件二分查找
  4. 手机号和邮箱正则匹配
  5. 第三章、Data语意学
  6. python elasticsearch 入门教程(二) ---全文搜索
  7. 深度学习-最优化笔记
  8. pycharm中一直跳出updating indices...indexing
  9. SAP Commerce Cloud,通过 ycommercewebservices OCC APIs 进行结账的一个技术限制
  10. [转] 实战 SSH 端口转发
  11. js控制图像等比例缩放
  12. 【数据库原理及应用】经典题库附答案(14章全)——第七章:数据库恢复技术
  13. K8S仪表板Service unavailable故障的解决办法
  14. Bash shell脚本练习(一)
  15. python什么时候用进程什么时候用线程_Python多线程/多进程释疑:为啥、何时、怎么用?...
  16. 机器学习(六)支持向量机svm初级篇
  17. 【HDU5091】Beam Cannon,扫描线+线段树
  18. js里css不起作用,CSS文件在NODE js中不起作用
  19. Pytorch中的torch.nn.Embedding()
  20. iwconfig工具源码

热门文章

  1. 织梦 php 传值,php获取post参数的几种方式
  2. java保存登录信息_java – 保存登录详细信息(首选项)android
  3. markdown如何设置图片大小_不会吧,还不会用markdown排版吗
  4. matlab读取data格式,ReadData3D 各种格式图像的读取,包括医学 效果很好 matlab 272万源代码下载- www.pudn.com...
  5. mysql四种隔离级别知乎_详解MySQL事务的四大特性和隔离级别
  6. 如何实现Android端获取RTSP|RTMP流转推RTMP
  7. 设置response.setContentType(“application/json;charset=utf-8“)后还是中文乱码
  8. controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常
  9. 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
  10. oracle排名怎么去除空值影响,Oracle排序中常用的NULL值处理方法