29.c/c++程序员面试宝典-类型转换构造函数
类型转换构造函数可以将其他类型直接转换为类的对象,是一种很方便的构造函数。
面试题114 类型转换有哪些分类**
分析:表达式是否合法取决于操作数的类型,而且合法的表达式其含义也由其操作数类型决定。但是,在c++中,某些类型之间存在相关的依赖关系。若两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,则称这两个类型相关。
在c++中,类型转换有隐式转换和显式转换两种。显式转换也称为强制类型转换,它具有一定的危险性。
【答案】在c++中,类型转换有隐式转换和显示转换两种。
面试题115 什么是类型转换构造函数**
分析:类型转换构造函数是一种特殊的构造函数,如果一个类的构造函数只有一个参数,而且这个参数不是该类的类型而是其他类型,这个构造函数就称为类型转换构造函数。如果程序代码现在创建时指定某一个数据成员的值,而让其他域中的值使用相同的默认值,转换构造函数就很有用。
一个类型转换构造函数的示例代码如下:
#include<iostream.h>
#include<math.h> //math.h包括sin,cos等
class Polar //极坐标中的点
{
private:
double radius; //定义极径变量
double angle; //定义极角变量
public:
Polar()
{
radius=0.0;
angle=0.0;
}
Polar(double r,double a)
{
radius=r;
angle=a;
}
void display()
{cout<<"("<<radius<<","<<angle<<")";}
double getr()
{return radius;}
double geta()
{return angle;}
}
class Rec
{
private:
double xco; //定义x坐标变量
double yco; //定义y坐标变量
public:
Rec()
{
xco=0.0;
yco=0.0;
}
Rec(Polar p)
{
float r=(float)p.getr(); //从polar对象中获得极径和极角
float a=(float)p.geta();
xco=r*cos(a); //变成x坐标和y坐标
yco=r*sin(a);
}
void display()
{cout<<"("<<xco<<","<<yco<<")";}
}
void main()
{
Rec rec;
Polar pol(10.0,0.785398);
rec=pol; //使用转换函数(或rec=Rec(pol))
cout<<"\nPol=";
pol.display(); //显示原始极坐标
cout<<"\Rec=";
rec.display(); //显示等价的直角坐标
}
上面代码是完成极坐标到直角坐标的转换,polar类中的数据radius和angle是私有的,因此必须提供函数直接访问。
【答案】一个类的构造函数只有一个参数,而且这个参数不是该类的类型而是其他类型,这个构造函数就被称为类型转换构造函数,转换构造函数可以用来处理不同域的同一个数据值。