1. 定义

类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型
形式 : operator type() const
type 表示某种类型,类型转换运算符可以面向任意类型(除void之外)进行定义,只要该类型能够作为函数的返回类型

用户定义的类类型转换 = 转换构造函数+ 类型转换运算符

eg.

class SmallInt{public:SmallInt(int i= 0):val(i){if(i < 0 || i > 255)throw std::out_of_range("Bad SmallInt value");}operator int() const{return val;}
private:    std::size_t val;
}

构造函数将算术类型的值转换成 SmallInt,而类型转换运算符将 SmallInt 对象转换成 int 。
隐式的用户定义类型转换可以置一个标准(内置)类型转换之前或之后

SmallInt si;
si = 4;    //首先将4隐式转换成SmallInt,然后调用SmallInt::operator=
int n = si + 3;//首先将si隐式地转换成int,然后执行整数加法
cout << n << endl;//调用lambda函数对象

2. 设计原则

  • 类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型
  • 不允许将转换成数组或者函数类型,但是允许转换成指针(包括:数组指针、函数指针)或者引用类型。
  • 没有返回类型,也没有形参
  • 通常不应该改变待转换对象的内容,因此,类型转换运算符一般被定义成 const 成员
  • 避免过度使用类型转换函数。

eg.

class SmallInt{public://编译器不会自动执行这一类型转换int operator int() const;//error:指定了返回类型operator int(int = 0) const;//error:指定了形参
}

3. 隐式类型转换

3.1 隐式可能产生意外结果

eg.

//使用 istream 的 bool 类型转换运算符将 cin 转换成 bool, 可能会变成1或0左移42位
int i = 42;
cin << i;

3.2 为了阻止隐式转换,使用explicit指定显式的类型转换运算符,之后可以使用显式的强制类型转换

class SmallInt{public://编译器不会自动执行这一类型转换explicit operator int() const {return val;}
}//显式地请求类型转换
SmallInt si=3;
int n = si + 3;//error
static_cast<int>(si)+3;//
  • 注意:向bool的类型转换通常用在条件部分,因此operator bool一般定义成explicit的。
  • C++ 11 新标准下IO 库定义了向 operator bool的显式类型转换
while(cin >> value)

输入运算符负责把数据读到 value 中,并返回 cin,为了对条件求值,cin 被 istream operator bool 类型转换函数隐式地执行了转换,如果 cin 的条件状态是 good,则函数返回真,否则返回假。

3.3. 当表达式出现在下列位置时,显式的类型转换被隐式执行:

  • if、while、do 语句的条件部分。
  • for 语句头的条件表达式。
  • 逻辑非(!)运算符,逻辑与(&&)运算符,逻辑或(||)运算符。
  • 条件运算符(? : )的条件表达式。

【引用】

[1] 代码classTypeExchange.h

C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换相关推荐

  1. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符

    如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...

  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换

    1. 在两种情况下会产生二义性转换歧义: 1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符. struct B; struct A {A() = de ...

  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符

    并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...

  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述

    1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...

  5. C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function

    1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

    1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符. eg. stable_sort(words.begin ...

  7. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

    1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...

  8. C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符

    成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...

  9. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符

    运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...

最新文章

  1. ListView使用技巧
  2. 2008R2 AD 域的安装
  3. JavaScript学习知识点归纳
  4. 数字图像处理:第五章 代数运算
  5. 周鸿祎详解360手机战略:赚钱不靠硬件靠服务
  6. Linux环境安装并配置Maven
  7. Netty技术细节源码分析-FastThreadLocal源码分析
  8. 生成 oracle 连接串,Generator连接Oracle数据库生成Model报错
  9. Linux sudo命令的概念与使用
  10. 2017.9.6.语文
  11. 监控oracle某条sql语句,Oracle-常用监控SQL语句
  12. 启示录:新加坡纬壹科技城成功建设经验
  13. 苹果电脑安装鸿蒙系统,苹果笔记本可以安装别的操作系统吗?
  14. 高速交警的救命忠告!常跑高速的一定要看!
  15. 2015最好用的PHP开源建站系统
  16. XML实现异构数据库间转换的实现与分析
  17. BMS-Pro电池巡检综合监控系统
  18. 深度学习笔记——情感分析
  19. 三神器-迭代器、生成器和装饰器
  20. 快速查询快递单号物流标记代收单号

热门文章

  1. Android --- Unable to resolve dependency for ‘:app@debug/compileClasspath‘: Could not resolve com.a
  2. mysql 立方根函数_PostgreSQL基础知识之SQL操作符实践指南
  3. mongodb 重启_mongodb历险记
  4. php验证器的调用,ThinkPHP5 验证器的具体使用
  5. 笔记本蓝牙显示输入码无效_小白笔记本连接蓝牙设备进阶篇
  6. 为什么维护工作让数据中心工作人员夜不能寐?
  7. AI:Algorithmia《2021 enterprise trends in machine learning 2021年机器学习的企业趋势》翻译与解读
  8. Python函数封装:利用正则表达式compile、findall对多组关键词进行模糊查询并返回统计个数,findall截取两个指定符号之间的内容
  9. 成功解决AttributeError: module tensorflow has no attribute placeholder
  10. 成功解决AttributeError: 'NoneType' object has no attribute '__array_interface__'