标准数据之间会进行 隐式类型安全转换。
转换规则:
隐式类型转换的问题:
#include <iostream>
#include <string>
using namespace std;
int main()
{
short s = 'a';
unsigned int ui = 1000;
int i = -2000;
double d = i;
cout <<"d = "<<d<<endl;//输出d = -2000
cout <<"ui= "<<ui<<endl;//输出 ui = 1000
cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ?
}
cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ?
根据:-2000 + 1000 应该等于-1000,但是这里编译器帮我们做了隐式类型转换将 int 类型的变量 i 隐式类型转换为 unsigned int i 然后进行 i 与 ui 相加。所以出现了问题。
普通类型与类类型进行强制类型转换。
使用转换构造函数。
#include <iostream>
#include <string>
using namespace std;
/*
使用普通类型强制转换为 类类型。
转换构造函数:
-有仅有一个参数
-参数是基本类型
-参数是其它类型
使用explicit 关键字。
*/
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = 0;
}
explicit Test(int i)//转换构造函数
{
mvalue = i;
}
};
int main()
{
Test t;
cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 0
// t = 5;//这里等价于 t= Test(5);
// Test tt= Test(5);
t = static_cast<Test>(5);
cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 5
t = Test(10);
cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 10
return 0;
}
运行结果:
t.getValue() = 0
t.getValue() = 5
t.getValue() = 10
在实际工程中使用explicit 关键字杜绝编译器的转换尝试。
转换构造函数被explicit 修饰只能进行显示转换
转换方式:
static_cast<className>(value);
className(value);例如:t= Test(5);
将类类型转换为普通类型:
C++ 中可以定义类型转换函数,用作将类转换为其它类型。
语法规则:
operator Type()
{
Type ret ;
........
return ret;
}
#include <iostream>
#include <string>
using namespace std;
/*
将类类型转换为普通类型:
*/
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = 0;
}
Test(int i)
{
mvalue = i;
}
operator int()
{
return mvalue;
}
};
int main()
{
Test t(100);
int i = t;
cout << "i = "<< i<<endl;//输出i = 100
return 0;
}
类类型互相转换:
定义类型转换函数
#include <iostream>
#include <string>
using namespace std;
/*
类类型互相转换
*/
class Test;
class value
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
value(int i)
{
mvalue= i;
}
explicit value(Test & t)
{
}
};
class Test
{
int mvalue;
public:
int getValue()
{
return mvalue;
}
Test ()
{
mvalue = 0;
}
Test(int i)
{
mvalue = i;
}
operator int()//类型转换函数
{
return mvalue;
}
value tovalue ()//类型转换函数 ,工程中以Type toType() 的公有成员函数代替。
{
// value ret(this->getValue());
value ret(mvalue);
cout << "operator value ()"<<endl;
return ret;
}
};
int main()
{
Test t(100);
int i = t;
cout << "i = "<< i<<endl;
value tt = t.tovalue();
cout << tt.getValue()<<endl;
return 0;
}
类型转换函数:
-无法抑制隐式的类型转换函数调用。
-类型转换函数可能与转换构造函数冲突。
-工程中以Type toType() 的公有成员函数代替。