美文网首页
C++笔记4--(Boolan)

C++笔记4--(Boolan)

作者: 如烟四月 | 来源:发表于2018-01-29 09:13 被阅读7次

    类型转换运算符(conversion operator)是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型。类型转换函数的一般形式如下所示:

    operator type() const;

    其中type表示某种类型。类型转换运算符可以面向任意类型(除了void之外)进行定义,只要该类型能作为函数的返回类型。因此,不允许转换成数组或者函数类型,但允许转换成指针(包括数组指针及函数指针)或者引用类型。类型转换运算符既没有显式的返回类型,也没有形参,而且必须定义成类的成员函数。类型转换运算符通常不应该改变待转换对象的内容,因此,类型转换运算符一般被定义成const成员。

    如果类中包含一个或多个类型转换,则必须确保在类类型和目标类型之间只存在唯一一种转换方式。否则,编写的代码很可能会有二义性。有两种情况可能会产生多重转换路径。

    第一种情况是两个类提供相同的类型转换:例如,当A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符时,就说它们提供了相同的类型转换。

    第二种情况是类定义了多个转换规则,而这些转换涉及的类型本身可以通过其他类型转换联系在一起。最典型的例子是算数运算符,对某个给定的类来说,最好只定义最多一个与算数类型有关的转换规则。

    一个函数模板就是一个公式,可用来生成针对特定类型的函数版本。

    当调用一个函数模板时,编译器通常用函数实参来推断模板实参。例如:

    cout<<compare(1,0)<<endl;

    编译器会推断出模板实参为int,并将它绑定到模板参数T。

    除了定义类型参数,还可以在模板中定义非类型参数。一个非类型参数表示一个值而非一个类型。通过一个特定的类型名而非关键字class或typename来指定非类型参数。

    当调用时:

    compare("hi","mom");

    编译器会使用字面常量的大小来代替N和M,从而实例化模板。编译器会在字符串字面常量的末尾插入一个空字符串作为终结符,因此编译器会实例化出如下版本:

    int compare(const char (&p1)[3],const char (&p2)[4])

    相关文章

      网友评论

          本文标题:C++笔记4--(Boolan)

          本文链接:https://www.haomeiwen.com/subject/vkntzxtx.html