Boolan C++(下)1

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后就没有了灰色的,未确定的东西。


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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容