侯捷C++视频笔记——C++面向对象高级编程(下)

C++面向对象高级编程(下)

01、简介

学习目标:

1.探讨上篇没有探讨过的问题
2.继续深入了解面向对象,包括虚指针,虚表,虚函数,以及多态

02、转换函数与explicit

1.转换函数

转换函数的特点:
1.转换函数不需要像普通函数声明返回值类型
2.转换一般一般都为const,因为它只是对一个值进行一个临时转换然后返回转换之后的值,而不是修改原有的值
3.转换函数可以有多种
在这里插入图片描述

如图

Fraction f(3,5) //这一句是调用了构造函数

double d = 4 + f;

这一句实际上进行了如下判断
首先是在查找有无符号“+”的重载函数,发现没有
然后再尝试寻找转换函数,发现4和f都有对应的转化函数,于是执行转换

2.构造函数的类型转换

构造函数会进行自动地隐式类型转换
在这里插入图片描述

如图,Fraction(译为分数)只需要一个参数num(分子),分母默认为1
当遇到类似这种语句时

Fraction d2 = f + 4;

编译器查找有没有关于符号"+"的重载,发现找到了,但是符号所需要的参数不对,应该是一个const Fraction& 类型,而这里是一个int类型,于是编译器试图对齐进行一个类型转换,由于类Fraction的构造函数仅需要一个int类型的参数,所以这里由于4满足条件,所以类Fraction的构造函数将其隐式转换成了Fraction类型的对象来执行了这个操作。

3.explict

如果同时存在可以隐式类型转换的构造函数Fraction以及转换函数double()时,会造成二义性调用而报错
在这里插入图片描述
为了解决这个问题,可以在函数前面加上关键字explicit

explicit关键字修饰的构造函数不能进行自动地隐式类型转换,只能显式地进行类型转换。

在这里插入图片描述

如图

Fraction d2 = f + 4;

这里报错的原因是,无法将4转换成一个Fraction值,因为Fraction类中重载了运算符+,需要右边也是Fraction类型的对象,但是Fraction的构造函数又不允许将int值4隐式转换成Fraction类对象,所以报错。

03、类的两种特殊形态:pointer-like class 和 function-like class

为了拓展指针的用法,我们会写出一些看起来“像指针”或者“像函数”一样的类。

1.pointer-like class

这里以智能指针和迭代器作为例子

1.智能指针

在这里插入图片描述

在智能指针中,一定需要两种指针最基础的运算符,即 * 和 -> 运算符。接受的是一个模板类型

Q:智能指针中关于->运算符的重载,为什么返回的是指针?
A:C++中特别的将->运算符设置成了一种“可传递”的运算符,也就是说虽然运算式"sp->method()"中sp“消耗掉”这个->运算符之后,得到的应该会是“pxmethod()”,但是这里特别的让表达式结果为“px->method()”,只是一个特例,记住即可

深入实践C++11智能指针

2.迭代器

迭代器也可以认为是一个功能较为特别的智能指针
迭代器由于需要在一个容器中遍历,必然需要一些类似于“向前”,“向后”的操作,在迭代器中的体现就是++和–运算符,这些对于一般的智能指针来说没有必要
在这里插入图片描述

2.function-like class

C++中也存在一些形似函数的类,也叫仿函数,它重载了()运算符,使得调用它就像调用函数一样,在STL中广泛运用,此处先了解概念,不进行详解
在这里插入图片描述

04、namespace经验谈

使用namespace可以比较方便的进行函数和变量之间的隔离

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值