C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
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 重载运算和类型转换)类类型转换相关推荐
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符
如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
1. 在两种情况下会产生二义性转换歧义: 1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符. struct B; struct A {A() = de ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符
并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述
1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function
1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符. eg. stable_sort(words.begin ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符
1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...
最新文章
- ListView使用技巧
- 2008R2 AD 域的安装
- JavaScript学习知识点归纳
- 数字图像处理:第五章 代数运算
- 周鸿祎详解360手机战略:赚钱不靠硬件靠服务
- Linux环境安装并配置Maven
- Netty技术细节源码分析-FastThreadLocal源码分析
- 生成 oracle 连接串,Generator连接Oracle数据库生成Model报错
- Linux sudo命令的概念与使用
- 2017.9.6.语文
- 监控oracle某条sql语句,Oracle-常用监控SQL语句
- 启示录:新加坡纬壹科技城成功建设经验
- 苹果电脑安装鸿蒙系统,苹果笔记本可以安装别的操作系统吗?
- 高速交警的救命忠告!常跑高速的一定要看!
- 2015最好用的PHP开源建站系统
- XML实现异构数据库间转换的实现与分析
- BMS-Pro电池巡检综合监控系统
- 深度学习笔记——情感分析
- 三神器-迭代器、生成器和装饰器
- 快速查询快递单号物流标记代收单号
热门文章
- Android --- Unable to resolve dependency for ‘:app@debug/compileClasspath‘: Could not resolve com.a
- mysql 立方根函数_PostgreSQL基础知识之SQL操作符实践指南
- mongodb 重启_mongodb历险记
- php验证器的调用,ThinkPHP5 验证器的具体使用
- 笔记本蓝牙显示输入码无效_小白笔记本连接蓝牙设备进阶篇
- 为什么维护工作让数据中心工作人员夜不能寐?
- AI:Algorithmia《2021 enterprise trends in machine learning 2021年机器学习的企业趋势》翻译与解读
- Python函数封装:利用正则表达式compile、findall对多组关键词进行模糊查询并返回统计个数,findall截取两个指定符号之间的内容
- 成功解决AttributeError: module tensorflow has no attribute placeholder
- 成功解决AttributeError: 'NoneType' object has no attribute '__array_interface__'