文章目录
一、类型转换函数(上)
1.再论类型转换
-
标准数据类型之间会进行
隐式的类型安全转换
- 转换规则如下:
下面来看一个有趣的隐式类型转换:
#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;
cout << "ui = " << ui << endl;
cout << "ui + i = " << ui + i << endl;
if( (ui + i) > 0 )
{
cout << "Positive" << endl;
}
else
{
cout << "Negative" << endl;
}
cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
return 0;
}
输出结果如下:
ui 为 unsigned int 类型, i 为 int 类型,将两者进行相加编译器会进行隐式的类型转换,全部变成 unsigned int 类型,所以最后的运行结果是正数。
s 和 ‘b 编译器都被编译器转换成 int 类型,因为 int 类型的运算是最高效的。
2.问题
普通类型
与
类类型
之间能否进行
类型转换
?
类类型
之间能否进行
类型转换
?
3.再论构造函数
-
构造函数可以定义
不同类型的参数
-
参数满足下列条件时称为
转换构造函数
-
有且仅有一个参数
-
参数是基本类型
-
参数是其它类类型
-
4.另一个视角
-
旧式的
C 方式强制类型转换
5.编译器的行为
-
编译器会
尽力尝试
让源码通过编译
-
编译器
尽力尝试
的结果是
隐式类型转换
-
隐式类型转换
-
会让程序以
意想不到
的方式进行工作 -
是工程中
bug
的重要来源
-
会让程序以
-
工程中通过
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;
}
输出结果如下:
6.小结(上)
-
转换构造函数
只有一个参数
-
转换构造函数的
参数类型是其它类型
-
转换构造函数在
类型转换时被调用
-
隐式类型转换是工程中
bug
的重要来源 -
explicit
关键字用于
杜绝
隐式类型转换
二、类型转换函数(下)
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;
}
int i = t; 等价于 int i = t.operator int ();
-
类型转换函数
-
与
转换构造函数
具有同等的地位 -
使得编译器有能力
将对象转化为其它类型
-
编译器能够
隐式的使用
类型转换函数
-
与
2.编译器的行为
-
编译器会
尽力尝试
让源码通过编译
3.注意事项
-
无法抑制
隐式的类型转换函数调用 -
类型转换函数
可能与转换构造函数冲突
-
工程中以
Type
toType()
的公有成员代替类型转换函数
下面看类类型之间的转换:
#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;
}
Value toValue()
{
Value ret;
cout << "operator Value()" << endl;
return ret;
}
};
int main()
{
Test t(100);
Value v = t.toValue();
return 0;
}
输出结果如下:
注意类型转换函数
可能与转换构造函数冲突
,所以 explicit Value(Test& t) { } 加了一个 explicit,如果不加,编译器可能会报错。
4.小结(下)
-
C++ 类中可以定义
类型转换函数
-
类型转换函数用于
将类对象转换为其它类型
-
类型转换函数与
转换构造函数
具有同等的地位 -
工程中以
Type
toType()
的公有成员代替类型转换函数