首页 > 代码库 > 第四十一课、类型转化构造函数(上)
第四十一课、类型转化构造函数(上)
一、C语言中的类型转换
1、标准数据类型之间会进行隐式的类型安全转换
2、转换规则如下
3、由此可知,如果是小类型转到大类型,C语言是支持隐式转换,是安全的
#include<iostream> using namespace std; int main() { short s = ‘a‘;//小类型转化为大类型,安全 unsigned int ui = 1000;//1000默认为int,小类型转化为大类型 int i = -2000; double d = i; cout << d << endl; if((ui + i) > 0)//unsigned int + int =====> unsigned int + unsigned int > 0 { cout << "Positive" << endl;//输出这个 } else { cout << "Negative" << endl; } cout << "sizeof(s + ‘b‘)=" << sizeof(s + ‘b‘) << endl;//4, short + char ====> int + int, 编译器认为int效率更快 return 0; }
二、再论构造函数
1、构造函数可以定义不同类型的参数
2、参数满足下列条件时称为转换构造函数
(1)、有且仅有一个参数
(2)、参数是基本类型
(3)、参数是其它类类型
3、旧式的c方式强制类型转换
int i; Test t; i = int(1.5); t = Test(100);
#include<iostream> using namespace std; class Test { private: int mValue; public: Test() { mValue = 0; } Test(int i) { mValue = i; } int value() { return mValue; } Test operator + (const Test& p) { Test ret(mValue + p.mValue); return ret; } }; int main() { Test t; t = 100;//编译器会尽量使源码编译通过
//100 默认为int 类型,编译器会去寻找看有没有转换构造函数发现 Test(int)
//所以这里相当于 t = Test(100)
cout << t.value() << endl;//100 Test tt; tt = t + 10;//这里是本意这样做还是手误? bug 的重要来源 cout << tt.value() << endl;//110 return 0; }
三、避免编译器的默认类型转换
1、工程中通过explicit关键字杜绝编译器的转换尝试
2、转换构造函数被explicit修饰时只能进行显示转换
3、转换方式
(1)、static_cast<ClassName>(value)//c++推荐的方式
(2)、ClassName(value)
(3)、(ClassName)value //不推荐
#include<iostream> using namespace std; class Test { private: int mValue; public: Test() { mValue = 0; } explicit Test(int i)//explicit 关键字 { mValue = i; } int value() { return mValue; } Test operator + (const Test& p) { Test ret(mValue + p.mValue); return ret; } }; int main() { Test t; t = static_cast<Test>(100);//没有强制类型转换时会报错 cout << t.value() << endl;//100 Test tt; tt = t + static_cast<Test>(10); cout << tt.value() << endl;//110 return 0; }
四、小结
1、转换构造函数只有一个参数
2、转换构造函数的参数类型是其它类型
3、转换构造函数在类型转换时被调用
4、隐式类型转换是工程中bug的重要来源
5、explicit关键字杜绝隐式类型转换
第四十一课、类型转化构造函数(上)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。