一、转换构造函数

(1)转换构造函数的作用

作用:将某种类型转换为类类型
例如有下面的代码:

  1. Base(int a); //转换构造函数
  2. Base b; //对象
  3. b=12;

解析:
程序将使用构造函数Base(int a)构造出一个临时的无名Base对象,并用12对其初始化。然后采用逐个成员赋值的方式将该临时对象的内容赋值给对象b。这一过程被称为隐式类型转换,因为它是自动的,不需要显式强制类型转换。

(2)转换构造函数基本形式

定义:只接受一个一个参数的构造函数才能作为转换构造函数。
对于这句话有两层含义:

  1. 构造函数在声明时,就只设置了一个参数。例如:Base(int a);
  2. 构造函数在声明时,设置了多个参数,但是其余参数都是有默认值的。例如:Base(int a,double b=12.0);

以上两种形式都可以。

(3)使用explicit关键字

在构造函数前面加上explicit关键字,那么将禁止这种隐式类型转换,但是还是可以进行显式转换。例如:

  1. explicit Base(int a);
  2. Base b; //对象
  3. b=12; //将会出错


二、转换函数

(1)作用:

它的作用正好和转换构造函数相反。它是将类类型转换为某种类型。将类对象赋值给typename变量或者将其强制转换为typename类型时,将自动调用转换函数。

  1. 假设定义了从Base类型转换为double类型的转换函数。
  2. 一、用户主动调用
  3. Base object(12); //类对象
  4. double a=double (object);
  5. double a= (double) object;
  6. //这两种调用形式都可以
  7. 二、由编译器决定如何做:
  8. Base object(10);
  9. double a=object;
  10. 编译器发现右侧是类类型,而左侧是double类型,因此他会查看程序员是否定义了与此匹
  11. 配的转换函数,如果没有,将编译出错。

(2)形式

形式如下:

  1. operator typename();

其中typename是要转换的类型,如果是double就是operator double();

注意事项:

1. 转换函数必须是类的成员函数
2. 转换函数无返回值
3. 转换函数不能有参数

因为typename已经指出要转换的类型,所以不需要参数。因为它是类的成员函数,所以是通过类对象来调用,从而告知要转换的值,因此不需要参数。