C++分析研究  
C++
日历
<2013年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234
统计
  • 随笔 - 92
  • 文章 - 4
  • 评论 - 4
  • 引用 - 0

导航

常用链接

留言簿

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

  但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!
  其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1.然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数!
  一、转换构造函数
  转换构造函数(conversion constructor function) 的作用是将一个其他类型的数据转换成一个类的对象?
  当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。
  转换构造函数是对构造函数的重载。
  例如:
  [cpp]
  Complex(double r)
  {
  real=r;
  imag=0;
  }
  其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0?用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换?
  那么如何使用转换构造函数进行类型转换呢?我们看如下的例子:
  [cpp]
  // TypeSwitch.cpp : 定义控制台应用程序的入口点。
  //
  #include "stdafx.h"
  #include <iostream>
  using namespace std;
  class Complex
  {
  public:
  Complex():real(0),imag(0){};
  Complex(double r, double i):real(r),imag(i){};
  Complex(double r):real(r),imag(0){}; // 定义转换构造函数
  void Print(){
  cout《"real = " 《 real 《" image = "《imag《endl;
  }
  Complex& operator+(Complex c){
  return Complex(this->real + c.real, this->imag + c.imag);
  }
  private:
  double real;
  double imag;
  };
  int main(int argc, _TCHAR* argv[])
  {
  Complex c;
  c = 1.2; // 调用转换构造函数将1.2转换为Complex类型
  c.Print();
  Complex c1(2.9, 4.2);
  Complex c2 = c1 + 3.1; // 调用转换构造函数将3.1转换为Complex类型
  c2.Print();
  return 0;
  }

  不仅可以将一个标准类型数据转换成类对象,也可以将另一个类的对象转换成转换构造函数所在的类对象?如可以将一个学生类对象转换为教师类对象,可以在Teacher类中写出下面的转换构造函数:
  [cpp]
  Teacher(Student& s)
  {
  num=s.num;
  strcpy(name,s.name);
  sex=s.sex;
  }
  使用方法同上!
  注意:
  1.用转换构造函数可以将一个指定类型的数据转换为类的对象?但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)?
  2.如果不想让转换构造函数生效,也就是拒绝其它类型通过转换构造函数转换为本类型,可以在转换构造函数前面加上explicit!例如sat答案
  [cpp]
  // TypeSwitch.cpp : 定义控制台应用程序的入口点。
  //
  #include "stdafx.h"
  #include <iostream>
  using namespace std;
  class Complex
  {
  public:
  Complex():real(0),imag(0){};
  Complex(double r, double i):real(r),imag(i){};
  explicit Complex(double r):real(r),imag(0){}; // explicit禁止构造函数的转换功能
  void Print(){
  cout《"real = " 《 real 《" image = "《imag《endl;
  }
  private:
  double real;
  double imag;
  };
  int main(int argc, _TCHAR* argv[])
  {
  Complex c1(1.2, 2.3), c2;
  double d;
  d = c1 + 1.1; // 调用类型转换函数将c1转换为double,编译出错!
  cout《d《endl;
  return 0;
  }
  二、类型转换函数
  用转换构造函数可以将一个指定类型的数据转换为类的对象?但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)?而类型转换函数就是专门用来解决这个问题的!
  类型转换函数的作用是将一个类的对象转换成另一类型的数据?
  如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数:
  [cpp]
  operator double( )
  {
  return real;
  }
  类型转换函数的一般形式为:
  operator 类型名( )
  {
  实现转换的语句
  }

  注意事项:
  1.在函数名前面不能指定函数类型,函数没有参数?
  2.其返回值的类型是由函数名中指定的类型名来确定的?
  3.类型转换函数只能作为成员函数,因为转换的主体是本类的对象,不能作为友元函数或普通函数?
  4.从函数形式可以看到,它与运算符重载函数相似,都是用关键字operator开头,只是被重载的是类型名?double类型经过重载后,除了原有的含义外,还获得新的含义(将一个Complex类对象转换为double类型数据,并指定了转换方法)?这样,编译系统不仅能识别原有的double型数据,而且还会把Complex类对象作为double型数据处理托福答案
  [cpp]
  // TypeSwitch.cpp : 定义控制台应用程序的入口点。
  //
  #include "stdafx.h"
  #include <iostream>
  using namespace std;
  class Complex
  {
  public:
  Complex():real(0),imag(0){};
  Complex(double r, double i):real(r),imag(i){};
  Complex(double r):real(r),imag(0){}; // 定义转换构造函数
  void Print(){
  cout《"real = " 《 real 《" image = "《imag《endl;
  }
  operator double(){ // 定义类型转换函数
  return real;
  }
  private:
  double real;
  double imag;
  };
  int main(int argc, _TCHAR* argv[])
  {
  Complex c1(1.2, 2.3);
  double d;
  d = c1 + 1.1; // 调用类型转换函数将c1转换为double
  cout《d《endl;
  return 0;
  }
  本例中,对于d = c1 + 1.1;先调用类型转换函数将c1转为double类型,然后在与1.1相加!
  那么程序中的Complex类对具有双重身份,既是Complex类对象,又可作为double类型数据?Complex类对象只有在需要时才进行转换,要根据表达式的上下文来决定?转换构造函数和类型转换运算符有一个共同的功能: 当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量)?

posted on 2013-12-01 20:20 HAOSOLA 阅读(407) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © HAOSOLA Powered by: 博客园 模板提供:沪江博客
PK10开奖 PK10开奖