C++ 转换构造函数和转换函数

一、转换构造函数

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

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

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

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

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

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

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

以上两种形式都可以。

(3)使用explicit关键字

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

explicit Base(int a);

那么

Base b;         //对象
b=12; 

将出错。

二、转换函数

(1)作用:

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

例如下面代码:

假设定义了从Base类型转换为double类型的转换函数。

一、用户主动调用
Base object(12);   //类对象
double a=double (object);
double a= (double) object;
//这两种调用形式都可以  

二、由编译器决定如何做:
Base object(10);
double a=object;

编译器发现右侧是类类型,而左侧是double类型,因此他会查看程序员是否定义了与此匹
配的转换函数,如果没有,将编译出错。

(2)形式

形式如下:

operator typename();

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

注意事项:

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章