注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 CCNA教材推荐
 帮助

C++:类型数据间的转换


2008-01-01 23:52:34
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/57650
标准类型数据间的转换,用转换构造函数进行类型转换,用类型转换函数进行类型转换。
author: ZJ 08-1-1
1.标准类型数据间的转换
1.1隐式类型转换
int i=6;
i=4.5+i; [Warning] converting to `int' from `double'
cout<<i<<endl;
结果:
10
这里编译器会给出警告,因为编译器会对4.5double类型处理,在求解表达式时,6转换成double,然后与4.5相加,得到10.5,在向整型变量赋值时,将10.5转为为整数10,然后赋给i。整个过程由C++编译器自动完成,因此此类转换称为隐式类型转换
 
1.2显式类型转换
C++也提供显式类型转换,其形式为,
类型名(数据),如int(11.1);//11.1转换成整型11
2.用转换构造函数进行类型转换
2.1什么是转换构造函数
通常把有一个参数的构造函数用作类型转换,称其为转换构造函数(有一个参数的构造函数也可以不用做类型转换)。转换构造函数的作用是将一个其他类型的数据转换成一个类的对象。
 
2.2四种类型的构造函数
到目前为止,已经接触了4种类型的构造函数,它们分别是(用例为一复数类Complex),
1】默认构造函数。
Complex();//没有参数
Complex(double=0,double=0);//提供默认的参数值
 
2】用于初始化的构造函数
Complex(double r,double i);//形参列表一般有两个以上参数
 
3】复制构造函数
Complex(Complex&);//形参是本类对象的引用
 
4】转换构造函数
Complex(double r){
  real=r;
  imag=0;
}
其作用是将double型的参数转换成Complex类的对象,将r作为复数实部,虚部为0
 
2.3转换构造函数的使用
使用转换构造函数将一个指定的数据转换为类对象的方法:
1】先声明一个类(如上面的Complex);
 
2】在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转换的方法;
 
3】在该类的作用域内可以用以下形式进行类型转换,
类名(指定类型的数据)
 
2.4一个实例
1】提出问题
下面给出一个复数类Complex,提供了2种构造函数。
class Complex{
  public:
    Complex(double r,double i){//用于初始化的构造函数
      real=r;
      imag=i;
    }
    Complex(double r){//转换构造函数
      real=r;
      imag=0;
    }
  private:
    double real,imag;
};
 
int main(){
  Complex c(0,0); //使用初始化构造函数
  c=c+2.5;error: no match for 'operator+' in 'c + 2.5e+0'
这里报错,意思是+号运算符没有被重载以用于Complex类对象与double之间的操作。
 
2】使用重载加运算符的方式修复之
class Complex{
  public:
    Complex operator+(double);//声明重载运算符+
};
 
Complex Complex:: operator+(double r){
  return Complex(real+r,imag);
}
 
int main(){
  Complex c(0,0);
  c=c+2.5;  //ok
 
3】使用转换构造函数的方式修复之
2.5先转换成Complex类类型,然后重载运算符+对两个类对象间实现+操作。
class Complex{
  public:
    Complex(double r,double i){
      real=r;
      imag=i;
    }                   
    Complex(double r){
      real=r;
      imag=0;
    }
    Complex operator+(Complex&);//重载+运算符
};            
 
Complex Complex:: operator+(Complex &c){
  return Complex(real+c.real,imag);
}
              
int main(){
  Complex c(0,0);
  Complex c1(2.5);//使用转换构造函数
  c=c+c1; 
...
不仅可以将一个标准类型数据转换成类对象,也可以将另一个类的对象转换成转换构造函数所在的类对象。下面定义一个从类Student到类Teacher的转换。
Teacher(Student&s){
  num=s.num;
  strcpy(name,s.name);
  sex=s.sex;
}
    用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(如将一个Complex类对象转换成double)。下面介绍类型转换函数可以实现这一点。
3.用类型转换函数进行类型转换
类型转换函数(type conversion function)作用是将一个类的对象转换成另一类型的数据
类型转换的一般形式为,
operator 类型名(){
  实现转换的语句
}
在函数名前不能指定函数类型,函数没有参数。在下面的例子中,Complex类提供将一个Complex对象转换为double的类型转换函数。
class Complex{
  public:
    Complex(double r=0,double i=0){
      real=r;
      imag=i;
    }                   
    operator double(){//类型转换函数
      return real;
    }        
  private:
    double real,imag;
};           
             
int main(){
  Complex c;
  double d;
  d=c+2.5;//ok
  system("PAUSE");
  return EXIT_SUCCESS;
}
由此可见,转换构造函数与类型转换函数有一个共同的功能:当需要的时候,编译器会自动调用这些函数,建立一个无名的临时对象(或临时变量),实现类型间的转换。
转换构造函数完成的是由标准数据类型(或一个类类型)转换至当前类类型;类型转换函数完成的是由当前类类型转换至标准数据类型。

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/57650



上一篇 C++:运算符重载  下一篇 抛硬币与掷骰子



    文章评论
 
2008-01-02 10:16:21
载开发时转换时很频繁的

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: