欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

第11节:掌握各类操作 - 自动与强制类型转换详解

最编程 2024-07-26 22:29:16
...

(四)类的自动转换和强制类型转换

1.对内置基本数据类型的转换:

    C++如何处理数据类型的转换,包括自动转换和强制转换

    如果两种数据类型兼容,那么会将赋值变量的类型自动转换为接收变量的类型。c++不自动转换不兼容的类型(比如指针类型和浮点型不能自动转换)。当无法进行自动转换时,我们可以进行强制类型转换(可以在类型上加括号,也可以在数据上加括号)。

2.类中常量的表示

    对于类中特定的常量,如果是整数,那么定义这个常量的枚举值将是很方便的,比如enum{xx=33};就是定义了一个33int型的符号常量。也可以采用静态常量的方法,比如static const int xx=33;

    如果定义的常量不是静态的,那么每次生成新的对象的时候我们可以初始化类常量,这个初始化只能进行一次,之后就不能再更改,这就是类常量的初始化(采用初始化列表的形式)。

3.将基本数据类型转换为类对象的隐式和显式转换函数(只接收一个参数的构造函数)

     只有接受一个构造参数的构造函数才能够成为隐式的转换函数,比如:stonewt myCat;myCat=19.6;就是用19.6作为接受一个参数的构造函数的参数来建立stonewt的临时对象,然后将临时对象赋给myCat。(也就是需要类对象的时候,我给了一个基本数据类型(或者是其他类对象),这个基本类型会被自动转换成类对象,此时使用的是构造函数,适用于从某基本类型到类类型的转换),有时候这种转换是有害的,我们需要关闭这种自动转换隐式转换),但仍然允许显式强制转换,可以使用explicit关键字来修饰,比如:explicit Stonewt(double lbs);自动类型转换有时候也会进行二步转换,比如使用int赋值给double单参数构造函数时,int先转换为double,再调用构造函数。

4.转换函数(指将类对象转换为基本数据类型)

   转换函数是用户定义的强制类型转换,可以像使用基本类型的强制类型转换那样来使用转换函数,比如double a = double(myCat);转换函数实际上也是类的函数类型名(比如double)就相当于函数名,转换函数同样可以使用两种形式的转换(尽量使用第一种)。比如double b=double(mycat);double b=(double)mycat;。转换函数同样在需要类型转换的时候自动起作用,我们也可以使用explicit关键字来关闭这项功能,只允许显式调用。

    转换函数要满足三点:一是转换函数必须是类方法,二是转换函数不需要指定返回类型(因为转换函数本身的名称就指定了返回类型,我们在函数体内必须要返回指定的类型,尽管原型没有声明返回类型),三是转换函数没有参数。同构造函数带来的自动转换一样,转换函数有时候也会在我们不希望进行转换的时候带来自动转换,这时候我们依然可以使用explicit来对其进行限定(显式转换函数)。应该谨慎选用隐式转换函数,通常最好选择仅在被显式调用时才会被执行的函数,以防止不希望进行的转换以及二义性的产生(二义性就是编译器有两种同样的选择,以至于不能选择使用哪种方法)。

    转换函数使用方法,原型operator double();(这是最基础的定义方法)或explicit operator double();(必须显式调用)或者explicit operator double()const;(对类对象不会产生更改)。当使用的时候,可以使用double(a)或(double)a两种方法的任意一种方法,前一种方法是c++新的用法,后一种是以前的语法形式。

    总之,只有一个参数的类构造函数类型与该参数相同的值转换为类类型,而被称为转换函数特殊类成员运算符函数用于将类对象转换为其他类型,转换函数是类成员没有返回值,没有参数,原型为operator typeName(return ...;);。转换构造函数和转换函数都可以使用explicit进行限定,以防止自动进行转换,而只能进行强制类型转换。(c++11的功能)。

5.转换函数和友元函数

    通过一些实例我们可以看到,将加法定义为友元,可以让程序更能适应自动类型转换,因为友元函数的参数都是对象或基本类型,不存在用对象调用方法的问题,而定义为类方法就会存在基本类型不是对象而无法调用的问题。另一方面,如果是友元函数,当参数类型不匹配的时候(比如需要的是类对象的引用,而给出的是基本数据类型),会自动调用一些隐式的构造函数,使用基本类型来构造一个类的临时对象,从而可以正确处理基本数据类型的类型匹配问题。

    加法的选择(参考):有两种方法,第一种就是上面所述的让基本类型进行自动转换,转换成类对象。第二种方法就是直接定义可以接受基本类型数据的加法重载运算符。第一种方法会增加额外开销,但是代码简单;第二种方法代码复杂一些,但是可以很快执行。因此,如果经常进行double和类对象的加法,那么就用第二种方法,如果只是偶尔出现,则用第一种方法,而且为了保险,可以使用显式类型转换(相当于构造临时对象)

推荐阅读