2011年计算机二级c++笔记:类的转换


  c++的内部数据类型遵照隐式类型转换规则。 假设某个表达市中使用了一个短整型变量, 而编译器依据上下文认为这儿需要是的长整型, 则编译器就会依据类型转换规则自动把它转换生长整型, 这种隐式转换出如今赋值、参数传递、返回值、初始化和表达式中。 我们也可以为类提供相应的转换规则。

  对一个类树立隐式转换规则需要构造一个转换函数, 该函数作为类的成员, 可以把该类的对象和其他数据类型的对象进行互相转换。 声明了转换函数, 就告诉了编译器, 当依据句法判定需要类型转换时, 就调用函数。

  有两种转换函数。 一种是转换构造函数;另一种是成员转换函数。 需要采用哪种转换函数取决于转换的方向。

  C++一、转换构造函数

  当一个构造函数仅有一个参数, 且该参数是不同于该类的一个数据类型, 这样的构造函数就叫转换构造函数。 转换构造函数把别的数据类型的对象转换为该类的一个对象。 和其他构造函数一样, 假如声明类的对象的初始化表同转换构造函数的参数表相婚配, 该函数就会被调用。 当在需要使用该类的中央使用了别的数据类型, 便宜器就会调用转换构造函数进行转换。

  本程序先调用time()函数来获取当前时间, 并把它赋给time_t对象;然后程序经过调用date类的转换构造函数来创立一个date对象, 该对象由time_t对象转换而来。 time_t对象先传递给localtime()函数, 然后返回一个指向tm构造(time. h文件中声明)的指针, 然后构造函数把构造中的日月年的数值拷贝给date对象的数据成员, 这就完成了从time_t对象到date对象的转换。

  二、成员转换函数

  成员转换函数把该类的对象转换为其他数据类型的对象。 在成员转换函数的声明中要用到关键字operator。 这样声明一个成员转换函数:

  在这个例子中, aaa就是要转换成的数据类型的说明符。 这里的类型说明符可以是任何合法的c++类型, 包括其他的类。 如上去定义成员转换函数;

  类名标识符是声明了该函数的类的类型说明符。 上面定义的date类并不能把该类的对象转换回time_t型变量, 但可以把它转换成一个长整型值, 计算从2000年1月1日到如今的天数。

  三、类的转换

  上面两个例子都是c++类对象和内部数据对象之间的互相转换。 也可以定义转换函数来实现两个类对象之间的互相转换。

  这个例子没有思索闰年情况。 但是在实际构造一个类时, 应该思索到所有成果的能够性。

  在date里中具有两种转换函数, 这样, 当需要从date型变为customdate型十, 可以调用成员转换函数;反之可以调用转换构造函数。

  不能既在date类中定义成员转换函数, 又在customdate类里定义转换构造函数。 那样编译器在进行转换时就不知道该调用哪一个函数, 从而出错。

  四、转换函数的调用

  c++里调用转换函数有三种方式:第一种是隐式转换, 例如编译器需要一个date对象, 而程序提供的是customdate对象, 编译器会自动调用合适的转换函数。 另外两种都是需要在程序代码中明白给出的显式转换。 c++强迫类型转换是一种, 还有一种是显式调用转换构造函数和成员转换函数。 下面的程序给出了三中转换方式:

  五、转换发作的情形

  上面的几个例子都是经过不能类型对象之间的互相赋值来调用转换函数, 还有几种调用的能够:

  参数传递

  初始化

  返回值

  表达式语句

  这些情况下, 都有能够调用转换函数。

  下面的程序不难了解, 就不剖析了。

  六、显式构造函数

  留意上面tester类的构造函数后面有一个explicit修饰符。 假如不加上这个关键字, 那么在需要把customdate对象转换成tester对象时, 编译器会把该函数当作转换构造函数来调用。 但是有时候, 并不想把这种只有一个参数的构造函数用于转换目的, 而仅仅希望用它来显式地初始化对象, 此时, 就需要在构造函数前加explicit。 假如在声明了tester对象以后使用了下面的语句将招致一个错误:

  这个错误说明, 虽然tester类中有一个以date型变量为参数的构造函数, 编译器却不会把它看作是从date到tester的转换构造函数, 因为它的声明中包含了explicit修饰符。

  七、表达式内部的转换

  在表达式内部, 假如发现某个类型和需要的不分歧, 就会发作错误。 数字类型的转换是很简单, 这里就不举例了。 下面的程序是把date对象转换生长整型值。

  在表达式中, 当需要转换的对象可以转换成某个数字类型, 或许表达式调用了作用于某个类的重载运算符时, 就会发作隐式转换。 运算符重载以后再学习。
文章由zero零度鞋质量整理,收集辛苦,希望能保留出处。

posted on 2011-05-09 04:53  jiyizhen3721  阅读(147)  评论(0编辑  收藏  举报