构造函数只用于从某种类型到类类型的转换,如果要进行相反的转换,可以使用特殊的运算符函数-转换函数。
语法:operator 数据类型();
注意:转换函数必须是类的成员函数;不能指定返回值类型;不能有参数。
可以让编译器决定选择转换函数(隐式转换),可以像使用强制类型转换那样使用它们(显式转换)。
int ii=girl; // 隐式转换。
int ii=(int) girl; // 显式转换。
int ii=int(girl); // 显式转换。
如果隐式转换存在二义性,编译器将报错。
在C++98中,关键字explicit不能用于转换函数,但C++11消除了这种限制,可以将转换函数声明为显式的。
还有一种方法是:用一个功能相同的普通成员函数代替转换函数,普通成员函数只有被调用时才会执行。
int ii=girl.to_int();
警告:应谨慎的使用隐式转换函数。通常,最好选择仅在被显式地调用时才会执行的成员函数。
示例:
#include <iostream>
using namespace std;
class Girl {
private:
int age;
public:
// 构造函数
Girl(int a) : age(a) {}
// 转换函数
operator int() const {
return age;
}
// 显式转换函数(仅C++11及之后版本支持)
explicit operator double() const {
return age * 2.0;
}
// 普通成员函数作为转换函数的替代方法
int to_int() const {
return age;
}
};
int main() {
Girl girl(20);
// 隐式转换
int age1 = girl; // 使用转换函数
cout << "Age1: " << age1 << endl;
// 显式转换
int age2 = static_cast<int>(girl); // 使用转换函数
cout << "Age2: " << age2 << endl;
// 使用显式关键字的转换
double ageDouble = static_cast<double>(girl); // 必须显式转换
cout << "Double Age: " << ageDouble << endl;
// 使用普通成员函数进行转换
int age3 = girl.to_int();
cout << "Age3: " << age3 << endl;
return 0;
}
代码说明:
- 类
Girl
有一个私有成员变量age
。 - 定义了一个转换函数,将
Girl
类型隐式转换为int
。 - 使用
explicit
关键字定义了另一个转换函数,将Girl
类型显式转换为double
。这需要在C++11及以上版本才支持。 - 提供了一个普通成员函数
to_int()
,用作转换函数的替代方法。 main
函数中展示了如何使用这些转换。