文章目录

  • 1 C++中的转换构造函数
    • 1.1 转换构造函数
    • 1.2 explicit关键字
  • 2 C++中的类型转换函数
    • 2.1 类型转换函数
  • 3 转换构造函数与类型转换函数之间的冲突
    • 3.1 转换构造函数与类型转换函数之间的冲突
    • 3.2 解决方案

1 C++中的转换构造函数

1.1 转换构造函数

我们知道构造函数可以定义不同类型的参数,参数满足下列条件时称为转换构造函数:

  • 有且仅有一个参数。
  • 参数是基本类型。
  • 参数是其它类类型。

看如下代码:

编译器尽力尝试的结果是隐式类型转换,隐式类型转换:

  • 会让程序以意想不到的方式进行工作。
  • 是工程中bug的重要来源。

1.2 explicit关键字

explicit关键字:

  • 工程中通过explicit关键字杜绝编译器的转换尝试。
  • 转换构造函数被explicit修饰时只能进行显示转换。

    普通类型到类类型示例代码:
#include <iostream>
#include <string>using namespace std;class Test
{int mValue;
public:Test(){mValue = 0;}explicit Test(int i){mValue = i;}Test operator + (const Test& p){Test ret(mValue + p.mValue);return ret;}int value(){return mValue;}
};int main()
{   Test t;t = static_cast<Test>(5);    // t = Test(5);Test r;r = t + static_cast<Test>(10);   // r = t + Test(10);cout << r.value() << endl;return 0;
}

2 C++中的类型转换函数

2.1 类型转换函数

为了实现类类型到普通类型之间的转换,我们需要引入类型转换函数。

类型转换函数:

  • C++类中可以定义类型转换函数。
  • 类型转换函数用于将类对象转换为其他类型。

类型转换函数:

  • 与转换构造函数具有同等的地位。
  • 使得编译器有能力将对象转换为其他类型。
  • 编译器能够隐式的使用类型转换函数。

类类型到普通类型之间的转换:

#include <iostream>
#include <string>using namespace std;class Test
{int mValue;
public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator int (){return mValue;}
};int main()
{   Test t(100);int i = t;cout << "t.value() = " << t.value() << endl;cout << "i = " << i << endl;return 0;
}

3 转换构造函数与类型转换函数之间的冲突

3.1 转换构造函数与类型转换函数之间的冲突

#include <iostream>
#include <string>using namespace std;class Test;class Value
{public:Value(){}explicit Value(Test& t){}
};class Test
{int mValue;
public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator Value(){Value ret;cout << "operator Value()" << endl;return ret;}
};int main()
{   Test t(100);Value v = t;   // 编译error,转换构造函数和类型转换函数都可以完成,编译器不知道选择哪一个函数,我们可以将转换构造函数前加上explicit关键字return 0;
}

3.2 解决方案

转换构造函数与类型转换函数:

  • 无法抑制隐式的类型转换函数调用。
  • 类型转换函数可能与转换构造函数冲突。
  • 工程中以Type toType()的公有成员代替类型转换函数。

qt中的解决方案:

#include <QDebug>
#include <QString>int main()
{QString str = "";int i = 0;double d = 0;short s = 0;str = "-255";i = str.toInt();d = str.toDouble();s = str.toShort();qDebug() << "i = " << i << endl;qDebug() << "d = " << d << endl;qDebug() << "s = " << s << endl;return 0;
}

参考资料:

  1. C++深度解析教程

C++中的转换构造函数和类型转换函数相关推荐

  1. [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数

    今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...

  2. C++转换构造函数和类型转换函数

    参考博客:https://blog.csdn.net/feiyanaffection/article/details/79183340 隐式类型转换 如果不同类型的数据在一起操作的时候编译器会自动进行 ...

  3. C++转换构造函数和隐式转换函数

    今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服! 其实我们已经在C/C ...

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

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

  5. 【C++的深度剖析教程20】类型转换函数上

    今天来学习类型转换函数. 一回顾 我们学习C语言的时候,都知道,标准的数据类型之间,是可以做类型的转换的.分为隐式类型转换和强制类型转换.那么强制类型转换呢,比较简单.但是隐式类型转换,却存在诸多问题 ...

  6. C++之类型转换函数

    一.转换构造函数的学习: 1.回忆数据类型转换: 在平时写代码的时候,最怕的就是那种隐式数据类型转换了,一不小心,软件就bug不断:而显式数据类型(一般是程序自己去强制类型转换,这个是我们能够明显的识 ...

  7. 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

    [MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...

  8. html类型转换函数,如何在JavaScript中转换数据类型?

    在JavaScript中,数据类型用于对一种特定类型的数据进行分类,确定可以分配给类型的值以及可以对其执行的操作.虽然由于类型强制,JavaScript会自动转换许多值,但为了达到预期的结果,通常最好 ...

  9. java数据类型的转换函数_JAVA中常用数据类型转换函数

    JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...

最新文章

  1. java web里实现 mvc_MVC模式在Java Web应用程序中的实现
  2. 安卓机高的地图要用浏览器打开_浏览器F12操作概述
  3. 计算机cmos芯片用途,什么是CMOS,它有什么用途?
  4. jquery文本和值text、html、attr、val
  5. 测试驱动的项目管理概念文档
  6. PyTorch学习笔记——语言模型
  7. u盘安装linux6.5教程,u盘安装CentOS6.5
  8. python教程ppt第五章_Python 3基础教程 第5章面向对象编程.ppt
  9. 自动驾驶—高精度地图or人工智能or其他
  10. 高速PCB设计规范(二)
  11. 最适合程序员的画图工具?
  12. DM6437的学习过程
  13. PS常用快捷键大全(2020版)
  14. 回溯法 | 图的m着色问题
  15. 奥克兰大学计算机领域优势,奥克兰大学世界排名及优势专业排名解析
  16. css3实现图片360度旋转及animation、@keyframes的详解
  17. 贝勒大学计算机专业,详细介绍美国贝勒大学之计算机科学
  18. AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 6 日)
  19. 拿到20W年薪offer的面试总结
  20. 计算机科学与技术理工英语4,2021年7月国开(中央电大)本科《理工英语4》期末考试试题及答案...

热门文章

  1. 搭建项目_跟着团子学SAP PS:项目模版搭建
  2. 【Paper】2010_Distributed optimal control of multiple systems
  3. 【控制】根轨迹分析及绘制
  4. TCL with SNPS llengthlappendget_cellsget_ports
  5. STM32系列--初识寄存器1
  6. ORACLE 11G RAC ASM磁盘全部丢失后的恢复
  7. JavaScript(15)jQuery 选择器
  8. 中科院NLPIR中文分词java版
  9. 桌面开发者的界面故事,该醒醒了
  10. 【javascript基础】8、闭包