C++中的转换构造函数和类型转换函数
文章目录
- 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;
}
参考资料:
- C++深度解析教程
C++中的转换构造函数和类型转换函数相关推荐
- [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数
今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...
- C++转换构造函数和类型转换函数
参考博客:https://blog.csdn.net/feiyanaffection/article/details/79183340 隐式类型转换 如果不同类型的数据在一起操作的时候编译器会自动进行 ...
- C++转换构造函数和隐式转换函数
今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服! 其实我们已经在C/C ...
- 类型转换函数(三十五)
我们之前在 C 语言中讲过类型转换,那么在 C++ 中是否还会有什么新特性呢?我们先来看看之前的类型转换是怎样的,标准数据类型之间会进行隐式的类型安全转换.转换规则如下 我们还是以代码为例来进行分析 ...
- 【C++的深度剖析教程20】类型转换函数上
今天来学习类型转换函数. 一回顾 我们学习C语言的时候,都知道,标准的数据类型之间,是可以做类型的转换的.分为隐式类型转换和强制类型转换.那么强制类型转换呢,比较简单.但是隐式类型转换,却存在诸多问题 ...
- C++之类型转换函数
一.转换构造函数的学习: 1.回忆数据类型转换: 在平时写代码的时候,最怕的就是那种隐式数据类型转换了,一不小心,软件就bug不断:而显式数据类型(一般是程序自己去强制类型转换,这个是我们能够明显的识 ...
- 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”
[MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...
- html类型转换函数,如何在JavaScript中转换数据类型?
在JavaScript中,数据类型用于对一种特定类型的数据进行分类,确定可以分配给类型的值以及可以对其执行的操作.虽然由于类型强制,JavaScript会自动转换许多值,但为了达到预期的结果,通常最好 ...
- java数据类型的转换函数_JAVA中常用数据类型转换函数
JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...
最新文章
- java web里实现 mvc_MVC模式在Java Web应用程序中的实现
- 安卓机高的地图要用浏览器打开_浏览器F12操作概述
- 计算机cmos芯片用途,什么是CMOS,它有什么用途?
- jquery文本和值text、html、attr、val
- 测试驱动的项目管理概念文档
- PyTorch学习笔记——语言模型
- u盘安装linux6.5教程,u盘安装CentOS6.5
- python教程ppt第五章_Python 3基础教程 第5章面向对象编程.ppt
- 自动驾驶—高精度地图or人工智能or其他
- 高速PCB设计规范(二)
- 最适合程序员的画图工具?
- DM6437的学习过程
- PS常用快捷键大全(2020版)
- 回溯法 | 图的m着色问题
- 奥克兰大学计算机领域优势,奥克兰大学世界排名及优势专业排名解析
- css3实现图片360度旋转及animation、@keyframes的详解
- 贝勒大学计算机专业,详细介绍美国贝勒大学之计算机科学
- AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 6 日)
- 拿到20W年薪offer的面试总结
- 计算机科学与技术理工英语4,2021年7月国开(中央电大)本科《理工英语4》期末考试试题及答案...