05. 对定制的类型转换函数保持警觉
C++允许编译器在不同类型之间执行隐式类型转换(implicit conversions)。
两种函数允许编译器执行这样的转换:
- 单自变量constructors
- 隐式类型转换操作符
单自变量constructors
单自变量constructors是指能够以单一自变量成功调用的constructors。如此的constructor可能拥有单一参数,也可能声明拥有多个参数,并且除了第一个参数之外都有默认值。下面给出其这两种形式:
class Name
{public:Name(const string& s); // 可以把string转换成Name
};class Rational
{public:Rational(int numerator = 0, int denominator = 1); // 可以把int转换成Rational
}
对于如下调用:
void TestFunc(Name myName)
{...
}string strName;
TestFunc(strName); // 调用成功,编译器调用了单参数的构造函数
编译不会报错,如果需要禁止这种行为,可以在单参数构造函数前加上关键字explicit即可。
class Name
{public:explicit Name(const std::string& s); // 禁止调用进行隐式类型转换
};
隐式类型转换操作符
隐式类型转换操作符是关键字operator之后加上一个类型名称。不需要指定返回值类型,因为其返回值类型基本上已经表现在函数名称上。
class Rational
{public:...operator double() const; // 将Rational转换为dobule
}
这个函数会在下面代码中自动调用:
Rational r(1, 2);
double d = 0.5 * r; // 将r转换成double, 然后执行乘法运算
接下来解释为什么最好不要提任何类型转换函数。根本原因在于,在你从未打算也未于其的情况下,此类函数可能会被调用,而其结果可能是不正确的、不直观的程序行为,很难调试。
例如,对于如下调用:
Rational r(1, 2);
cout << r;
因为没有对Rational实现operator << , 所以预期会编译报错,但是结果确实正常运行,因为r会被编译器进行隐式类型转换成double类型。这也显示:隐式类型转换,它们的出现可能导致错误(非预期)的函数被调用。
解决的办法是以功能对等的另外一个函数取代类型转化操作符。
例如为了允许将Rational转换为double,可以以一个名为asDouble的函数取代operator double。
class Rational
{public:...double asDouble() const; // 将Rational转换为double
};
此后member function必须被明确调用:
Rational r(1, 2);
cout << r; // 错误,Rational没有operator <<。
cout << r.asDouble(); // 可以以double形式输出
大部分时候,"必须明白调用类型转换函数"虽然带来了些许不便,却可以为"不再默默调用那些其实并不打算调用的函数"而获得弥补。这也是为什么不存在从string object至C-style char*的隐式转换函数的原因。而是提供了一个显示的member function c_str()来执行上述转换行为。
05. 对定制的类型转换函数保持警觉相关推荐
- GBase 8c 函数和操作符 - 类型转换函数 之 类型转换函数
cash_words(money) 描述:类型转换函数,将money转换成text. 示例: gbase=# SELECT cash_words('1.23'); cash_words ------- ...
- GBase 8c V3.0.0数据类型——类型转换函数
l cash_words(money) 描述:类型转换函数,将money转换成text. 示例: gbase=# SELECT cash_words('1.23'); cash_words ----- ...
- python数字类型转换函数_Python的数据类型转换函数
玩蛇网这篇文章给大家介绍关于,Python数据类型的转换函数. Python提供了一些可以把某个值从一种数据类型,转换成为另一种数据类型的内置函数和方法.int函数可以将任何可以转换为整型的值转换为整 ...
- C++中类型转换函数:将当前类的类型转换为其它类型
1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...
- Sql Server函数全解三数据类型转换函数和文本图像函数
原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...
- 类型转换函数(三十五)
我们之前在 C 语言中讲过类型转换,那么在 C++ 中是否还会有什么新特性呢?我们先来看看之前的类型转换是怎样的,标准数据类型之间会进行隐式的类型安全转换.转换规则如下 我们还是以代码为例来进行分析 ...
- FPGA之道(25)VHDL数据类型转换函数与数据对象的属性
文章目录 数据类型转换函数 数据对象的属性 数值类属性 Signal属性 数据类型转换函数 在VHDL的众多数据类型中,归根到底,它们都是要用二进制数来表示的,所以它们之间几乎都是可以相互转换的.在有 ...
- python类型转换-Python的数据类型转换函数
玩蛇网这篇文章给大家介绍关于,Python数据类型的转换函数. Python提供了一些可以把某个值从一种数据类型,转换成为另一种数据类型的内置函数和方法.int函数可以将任何可以转换为整型的值转换为整 ...
- # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符...
c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...
- C++中的转换构造函数和类型转换函数
文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...
最新文章
- 【端口号和服务漫谈】
- ebpf 学习-bpftrace 语法 入门
- Binary Search O(log n) algorithm to find duplicate in sequential list?
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
- 羽毛球:东南大学vs南京大学
- BZOJ1086 [SCOI2005]王室联邦(树分块)
- js实现实时的时间显示
- 安全电子签章密码技术规范_最新|8项网络安全国家标准详情公布!10月1日正式实施(附8项标准全文)...
- 外接圆、内切圆半径公式及对应关系知识点总结
- Making Pre-trained Language Models Better Few-Shot Learners
- 爬取腾讯招聘的招聘信息(简单)
- wifi辐射安全距离
- java anon,shiro anon 不生效
- 关于模型的评估指标(超详细)
- 天津出差系列(七)----第七天
- 牛市最容易亏钱而熊市才是真正的开始
- google账号登录第三方平台实现
- 服务器修复oxc0000098,Win10引导文件BCD文件误删或损坏启动错误0xc0000098的解决方法...
- 【持续更新】这个免费的软件资源库,你一定要收藏好!
- LMS scorm1.2 JAVA开发经历
热门文章
- Lintcode68 Binary Tree Postorder Traversal solution 题解
- js 定义函数的几种方法 以及如何调用
- python __setattr__, __getattr__, __delattr__, __call__
- Android 开发性能优化
- 从PCI上读取数据 线程和定时器效率
- 高效程序猿之(四)VS2010其他技巧(转)
- 获取图层字段的唯一值集合(ArcEngine)
- 第一届数据库***大赛(欢迎大家共同讨论,发表自己的见解)
- 9.Nginx 日志管理
- 编程语言 - 大数据 - Hadoop