美文网首页
Boolan C++(下)1

Boolan C++(下)1

作者: rrreal | 来源:发表于2017-05-11 11:38 被阅读0次

    1.Conversion Function

    基本类型之间可以互相转换,那么类类型呢?看下面代码

    输出结果是4.6

    在运算 4 + f 时有两条路:

    (1)编译器会去找有没有一个叫 operator + 的函数(这里只给出类内的例子)

    (2)如果没有就去找一个叫 operator double 的函数

    转换函数的语法: operator 类型()

    在这个例子中只有operator double()所以编译器会先调用他把 f 转换成 0.6 然后加上 4。

    在类中可以写多个转换函数,只要觉得有必要,在需要转换的场合编译器会自己去调用相应的转换函数(和隐式类型转换很像,当然也可以强转)。

    2.non-explicit-one-argument ctor


    当执行到 f + 4 时,会调用operator + 这个函数,然而 4 是一个整数不是Fraction类(operator +的参数是const Fraction& m),那么4要怎么加到 f 上去呢?

    看一下构造函数:

    这个构造函数他有两个参数,其中一个是有默认值的,另外一个需要自己传递参数,这种只需要传递一个参数的构造函数被叫做单参构造。

    当执行 f + 4 时,会先调用单参构造函数,将4变成一个Fraction(4,1)对象(在临时区里),然后在调用operator + 。

    单参构造函数可以把别的东西转换成对应的类型(只要可以转换)。

    2.1Conversion Function vs non-explicit-one-argument ctor


    当转换函数和单参构造并存的时候就会发生error

    这是因为编译器有两条路完成 d2 = f + 4

    (1)调用单参构造,将4转换成Fraction对象,然后调用operator +,完成计算。

    (2)调用operator double ,将 f 转换成double类型加上4,再调用单参构造转换成Fraction对象,最后赋值。

    这时编译器无法自动选择哪一条路,需要在单参构造函数前面加上explicit

    2.2Explicit-one-argument ctor


    加上explicit后,编译出现新的error

    编译器说:无法将double类型转换成Fraction类型

    这是因为,先调用了operator double 将 f 转换成double,然后加上4,这时原本需要使用单参构造把结果转成Fraction类型,但是由于explicit,单参构造不能被调用,所以报错:无法将double类型转换成Fraction类型。

    explicit关键字:在编译有歧义的时候,起到禁止编译器自动调用的功能。

    这个关键字一般只在以上这种情况下加在构造函数前。

    3.pointer-like classe

    一个C++的class可能会像一个指针(面向指针),为什么要把一个class设计的像一个指针呢,因为我们希望这个class对象能比普通的指针多做一些事情(这是一个聪明的指针)

    在上面的代码中,通过重载 * 和 -> 这两个操作符让类可以像指针一样使用的能力

    智能指针中 * 的操作符重载无一例外,都是如上述代码这样写,因为想要和对指针解引用,必需返回的是*px(取px指向的地址的内容)。

    ptr->print(); 通过重载解释,->与ptr作用,然后返回的是px(指向内容的地址),然->应该没有了呀(操作符使用掉了),那为什么相当于px->print(),为什么->还留在那里,这是因为->符号只要在那里,他的作用会一直保持着,不会被消耗掉。->的写法也是固定的。

    4.Function-like classes

    函数名后面都有一个()操作符,这个()操作符的名字叫 函数调用操作符,将()重载之后,类对象就能像函数一样使用。

    5.member template

    成员模板语法:

    在类中,下面的构造

    是类中的一个成员,这个成员自己本身又是一个模板,我们就把这种成员叫为 成员模板。

    使用:

    在泛型编程中,在构造函数,拷贝构造这类函数上面会大量用到成员模板,用来增加函数的通用性。

    在智能指针中也有应用:

    6.specializtion

    设计一个泛型的Compare类用来比较不同数据类型之间的大小:

    这个例子只是比较了整数之间的大小,如果我们想用来比较浮点数之间的大小,那么这个例子就不可行了,因为浮点数在计算机中不能精确的比较,只能指定一个差值范围进行比较。

    那么就需要对泛型类进行特化处理:

    有时为了需要,针对特定的类型,需要对模板进行特化,这其实就是特殊处理。

    7.template template parameter


    注意:

    class Sequence = deque不是模板模板参数,因为在指定模板参数时,Sequence的值已经指定好了,这个模板指定了T后就没有了灰色的,未确定的东西。

    真正的模板模板参数需要手动指定

    相关文章

      网友评论

          本文标题:Boolan C++(下)1

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