C++类类型的转换

来源:互联网 发布:mac开机有个客人用户 编辑:程序博客网 时间:2024/04/25 12:19

 c++的类类型转换 - hsujouchen - hsujouchen的博客     
      说到类型转换,编写过程序的一定不会感到陌生。如:
      double d = 3.1415;
      int i = 2;
      d = d * i;
      上面的代码可以正常编译和运行(也许有些编译器会发出警告)。在c++中,对这些不同的内置类型发生运算操作时候,会自动进行类型的匹配。一般是低精度的类型自动匹配到高精度的类型。而对于复杂的类型,如结构体和类,也是存在相类似的系统,只不过要程序员自行定义。假设有类A
       class A
       {
         public:
           bool equal(const A& a){ return val == a.val;}
           int val;
       }
       A a;
当遇到如下的语句的时候
      a.equal(2);                                                                             (1)
编译器会发出错误提示,原因是不能把类型int转换成A。但是如果对类A,增加一个构造函数:
      public:
          A(int a){}                                                                                (2)
那么语句(1)就可以正常编译通过了。这是因为c++里面,对单个实参的构造函数都有参数类型到类类型的一个隐式转换,所以在增加了(2)之后的(1)的代码,可能就被编译器看成了
     a.equal(new A(2))                                                                          (3)
在这种情况下可以运行的很好,但是看了许多资料还是建议在单实参前面加上关键字:explicit来说明构造函数只负责初始化而不进行隐式的转换。

     反过来说,如果存在以下的语句:
    if(2 == a){......}                                                                                (4)
    编译器会报错,原因是==号两边的类型不匹配。当然我们没有告诉编译器类和整型如何比较。但是如果加上
    public:
      operator int(){return val;}                                                               (5)
 那么语句(4)就能够通过编译而且能够运行的很好。这是因为(5)告诉编译器类A可以执行到Int行的转换,当编译器到达(4)的时候发现不匹配,就从类A中的方法中寻找,并找到了(5),所以编译成功。类类型到其它类型的转换的格式是: operator type(){} 这里 type可以是除void的任何类型,但是不提倡数组类型或者是函数类型。

 

 

 

类型转换分为以下几种情况
1. 如果需要某类A的类型,传入的类型为B,而A正好有只需要参数B的构造函数,则调用A(B)函数构造一个A

2. 需要A的类型,而当前的类型为B.A也没有只需要参数B的构造函数,则调用B的强制类型转换函数operator A(),强制转换B.否则就出错。

3. 派生类的指针和引用不用强制转换就可以当成基类的使用。其他强制类型的转换除非自己保证否则不一定正确。

4. 类型转换里面临时的常量可以作为const引用使用,临时常量可以作为变量使用。但是用const修饰了的量不能使用在没有用const修饰的地方。简单地说就是const不可以转换为非const,但是非const可以转换为const。const类型的类只能调用自己的const修饰的函数。

原创粉丝点击