普通类型到类类型的转化:转换构造函数
类类型到普通变量/其他类类型的转化:类型转换函数
转化构造函数:
1.只有一个参数。
2.参数时基本类型或则其他类类型。
3. 编译器会隐式的调用转换构造函数。
#include<iostream> #include<string> using namespace std; class Test { public: Test(){} Test(int i){} // 转换构造函数 }; int main(void) { Test t; t = 5; // 调用隐式类型转换函数 t= test(5); return 0; }
通过关键字可以防止编译器的隐式转化的尝试
当转换构造函数被explicit修饰时,只能进行显示的转换。
static_cast<ClassName>(value); // 显示的转化 ClassName t = 5; // 隐式的转化(不推荐) ClassName(vlaue); (ClassName)value;
普通类型到类类型的转化:
#include <iostream> #include <string> using namespace std; class Test { int mValue; public: Test() { mValue = 0; } explicit Test(int i) // 加explicit的转换构造函数 { 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); return 0; }
类型转换函数:
1. 类类型到普通变量/其他类类型的转化。
2. 编译器会隐式的调用类型转化函数。
语法:
operator Type() // Type 是将要转换的类型 { Type ret; // do something return ret; }
在类型到类型的转换中:当一个类定义类型转换函数另一个类定义转换构造函数时,产生冲突。
解决办法:定义类的构造转换函数为 explicit
Class Test { int value; public: Test(int i){value = i;} int Test(){return Test;} Test(Value& v){} //Test的转换构造函数 }; Class Value { int value; public: Value(int i){value = i;} int value(){return value;} operator Test(){Test ret;return ret;} //Value的类型转换函数 }; int main(void) { Test t(100); Value v(10); t = v; // 报错,冲突 rturn 0; }
不要实现类型转换函数,用公有成员函数代替类型转换函数。
Type toType()
调用公有成员函数将其他类型转换为Type类型。
Class Value { char value; public: Value(int i){value = i;} int value(){return value;} int toint(){int ret;return ret;} //公有成员转换函数 long tolong(){long ret;return ret;} //公有成员转换函数 float tofloat(){float ret;return ret;} //公有成员转换函数 }; int main(void) { Value v(10); int a = v.toint(); // 调用对应的转换函数 long b = v.tolong(); // float c = v.tofloat(); // rturn 0; }