6.5 类型转换
类型转换是将一种数据类型的值转换为另一种数据类型的值。类型转换分为自动隐式转换和强制转换两种类型。
6.5.1 类型的自动隐式转换
C++ 语言编译系统提供了内部数据类型的自动隐式转换规则:
1. 算术运算中的转换
在算术运算中,低类型可以自动转换为高类型。例如:
double a;
a = 3.9 * 4;
在这个例子中,整型数 4
自动转换为浮点数,与浮点数 3.9
相乘,结果为浮点数,并赋值给 a
。
2. 赋值表达式中的转换
在赋值表达式中,右边表达式的值自动转换为左边变量的类型。例如:
long var;
var = 10;
整型数 10
自动转换为长整型,并赋值给 var
。
3. 函数调用时的转换
在函数调用时,实参值会自动转换为形参的类型。例如:
double f1(double d);
double f;
f = f1(10);
函数 f1
需要一个 double
型参数,而实参是整型数 10
,系统会自动将 10
转换为 double
型并传递给 f1
。
4. 函数返回值的转换
当函数有返回值时,系统会自动将返回表达式的类型转换为函数的返回类型。例如:
double f1(float d) {
float m;
m = d * 2;
return m;
}
在这个例子中,m
是 float
型,但函数返回类型是 double
,因此 m
会自动转换为 double
并返回。
示例代码
#include <iostream>
using namespace std;
int main() {
double a;
a = 3.9 * 4;
cout << "a = " << a << endl;
long var;
var = 10;
cout << "var = " << var << endl;
double f1(double d);
double f;
f = f1(10);
cout << "f = " << f << endl;
return 0;
}
double f1(double d) {
return d;
}
6.5.2 构造函数具有类型转换功能
当类定义中提供了单个参数的构造函数时,该类可以将某种数据类型的值转换为该类的对象。
示例
#include <iostream>
using namespace std;
class A {
public:
A() : m(0) {}
A(double i) : m(i) {}
void print() {
cout << m << endl;
}
private:
double m;
};
int main() {
A a(5);
a = 10;
a.print();
return 0;
}
在这个例子中,有一个单参数构造函数 A(double i)
,它可以将 double
型值转换为 A
类对象。因此,赋值语句 a = 10
能顺利通过编译并运行。
6.5.3 类型转换函数
类型转换函数是类中的非静态成员函数,用于将类的对象转换为其他类型的值。其定义格式如下:
class 类名 {
public:
operator 目标类型();
};
示例
#include <iostream>
using namespace std;
class Rational {
public:
Rational(int d, int n) : den(d), num(n) {}
operator double() {
return double(den) / double(num);
}
private:
int den, num;
};
int main() {
Rational r(5, 8);
double d = 4.7;
d += r;
cout << d << endl;
return 0;
}
在这个例子中,类型转换函数 operator double()
将 Rational
对象转换为 double
型,因此可以进行 d += r
操作。
类型转换函数注意事项
- 类型转换函数必须是非静态成员函数。
- 类型转换函数不能有返回值。
- 类型转换函数不带任何参数。
- 类型转换函数不能定义为友元函数。
通过这些示例,我们可以看到类型转换在 C++ 中的多种应用及其实现方法。了解并正确使用这些转换,可以提高程序的灵活性和可读性。