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. 对定制的类型转换函数保持警觉相关推荐

  1. GBase 8c 函数和操作符 - 类型转换函数 之 类型转换函数

    cash_words(money) 描述:类型转换函数,将money转换成text. 示例: gbase=# SELECT cash_words('1.23'); cash_words ------- ...

  2. GBase 8c V3.0.0数据类型——类型转换函数

    l cash_words(money) 描述:类型转换函数,将money转换成text. 示例: gbase=# SELECT cash_words('1.23'); cash_words ----- ...

  3. python数字类型转换函数_Python的数据类型转换函数

    玩蛇网这篇文章给大家介绍关于,Python数据类型的转换函数. Python提供了一些可以把某个值从一种数据类型,转换成为另一种数据类型的内置函数和方法.int函数可以将任何可以转换为整型的值转换为整 ...

  4. C++中类型转换函数:将当前类的类型转换为其它类型

    1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...

  5. Sql Server函数全解三数据类型转换函数和文本图像函数

    原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...

  6. 类型转换函数(三十五)

    我们之前在 C 语言中讲过类型转换,那么在 C++ 中是否还会有什么新特性呢?我们先来看看之前的类型转换是怎样的,标准数据类型之间会进行隐式的类型安全转换.转换规则如下 我们还是以代码为例来进行分析 ...

  7. FPGA之道(25)VHDL数据类型转换函数与数据对象的属性

    文章目录 数据类型转换函数 数据对象的属性 数值类属性 Signal属性 数据类型转换函数 在VHDL的众多数据类型中,归根到底,它们都是要用二进制数来表示的,所以它们之间几乎都是可以相互转换的.在有 ...

  8. python类型转换-Python的数据类型转换函数

    玩蛇网这篇文章给大家介绍关于,Python数据类型的转换函数. Python提供了一些可以把某个值从一种数据类型,转换成为另一种数据类型的内置函数和方法.int函数可以将任何可以转换为整型的值转换为整 ...

  9. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符...

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...

  10. C++中的转换构造函数和类型转换函数

    文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...

最新文章

  1. 【端口号和服务漫谈】
  2. ebpf 学习-bpftrace 语法 入门
  3. Binary Search O(log n) algorithm to find duplicate in sequential list?
  4. BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
  5. 羽毛球:东南大学vs南京大学
  6. BZOJ1086 [SCOI2005]王室联邦(树分块)
  7. js实现实时的时间显示
  8. 安全电子签章密码技术规范_最新|8项网络安全国家标准详情公布!10月1日正式实施(附8项标准全文)...
  9. 外接圆、内切圆半径公式及对应关系知识点总结
  10. Making Pre-trained Language Models Better Few-Shot Learners
  11. 爬取腾讯招聘的招聘信息(简单)
  12. wifi辐射安全距离
  13. java anon,shiro anon 不生效
  14. 关于模型的评估指标(超详细)
  15. 天津出差系列(七)----第七天
  16. 牛市最容易亏钱而熊市才是真正的开始
  17. google账号登录第三方平台实现
  18. 服务器修复oxc0000098,Win10引导文件BCD文件误删或损坏启动错误0xc0000098的解决方法...
  19. 【持续更新】这个免费的软件资源库,你一定要收藏好!
  20. LMS scorm1.2 JAVA开发经历

热门文章

  1. Lintcode68 Binary Tree Postorder Traversal solution 题解
  2. js 定义函数的几种方法 以及如何调用
  3. python __setattr__, __getattr__, __delattr__, __call__
  4. Android 开发性能优化
  5. 从PCI上读取数据 线程和定时器效率
  6. 高效程序猿之(四)VS2010其他技巧(转)
  7. 获取图层字段的唯一值集合(ArcEngine)
  8. 第一届数据库***大赛(欢迎大家共同讨论,发表自己的见解)
  9. 9.Nginx 日志管理
  10. 编程语言 - 大数据 - Hadoop