当前位置首页 > 百科资料> 正文

转换构造函数

2022-06-29 11:28:00 百科资料

在C++中,类的构造函数可以省略不写,这时C++会为它自动创建一个隐式默认构造函数(implicit default constructor);也可以由用户定义带参数的构造函数,构造函数也是一个成员函数,他可以被重载;当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。

  • 中文名称 转换构造函数
  • 外文名称 implicit default constructor
  • 性质 计算机
  • 类别 编程

简介

  例如:

  class Complex

  {

  protected:

  double real,vir; //复数的实部和虚部

  public:

  Complex(double x)

  { real=x,vir=0;}

  };

  这个构造函数即 转换构造函数。

  如上文。构造函数只有一个参数 double x,它也不是本类的const引用。

应用

  1、转换构造函数一般由系统自动调用(当然代码里自己调用完全没问题),这点很利于编程。

  例如:Complex t=5.0;//或Complex t(5.0);或Complex t=Complex(5.0);或Complex t=(Complex)5.0;

  这时系统就自动调用了 Complex(double x)将 5.0转换成Complex类,再赋值给 t 。

  2、如果定义了 操作符重载函数 Complex operator + (const Copmlex a ,const Complex b);

  而且在Complex类中定义了类型转换函数 operator double() {.....; }。

  例如类的声明如下:

  class Complex

  {

  public:

  Complex(){real=0;vir=0;}//构造函数1

  Complex(double r){real=r;vir=0;}//构造函数2/转换构造函数

  Complex(double r,double i):real(r),vir(i){}//构造函数3

  friend Complex operator + (Complex &c1,Complex &c2);//重载"+"运算符

  operator double(){return real;}//类型转换函数

  private:

  double real; double vir;

  };

  //还需在类外定义运算符重载函数operator +如下

  Complex operator + (Complex &c1,Complex &c2)

  {return Complex(c1.real+c2.real; c1.vir+c2.vir);}

  这时,语句:

  Complex b=t + 4.8;

  就能直接编译通过,且4.8和t的位置可互换,即满足加法交换律,但是当编译器编译到这行语句时,不同的编译器会有不同的反应,有的编译环境下,如dev c++会把t转换为double数值,若t=1+1i则执行完此行语句后b=5.8+0i(注意类声明中的类型转换函数),此时对运算符+的重载不起作用;而有的编译器则会自动执行转换构造函数,把4.8转换为一个对象即4.8+0i,再与t相加 执行结果为b=5.8+1i,此时对运算符+的重载起作用,因为在类Complex中将运算符重载函数定义为了友元函数,这个函数需要两个Complex的对象作为参数。

  若去掉类型转换函数一行,GCC编译器编译不能通过,因为Complex建立的临时对象不能转化为非const引用,只需将友元运算符函数的形参加上const就可通过编译。 即:

  friend Complex operator + (const Complex &c1,const Complex &c2);

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net