从这周开始,进入了c++下半部分的学习,这周学习的东西相对之前来说比较琐碎,但都是值得注意的地方。

一、转换函数

转换函数是一种特殊类型的类成员函数。它定义了一个由用户定义的转换,以便把一个类对象转换成某种其他的类型。
在类的声明中,通过指定关键字operator,并在其后加上转换的目标类型可以来声明转换函数,一般格式为:

operator type()

转换函数的基本规则:
        (1)转换函数只能是成员函数,无返回值,空参数。
        (2)不能定义到void的转换,也不允许转换成数组或者函数类型。
        (3)转换常定义为const形式,原因是它并不改变数据成员的值。

具体的例子:

class Fraction {
public:Fraction(int num, int den) :m_numerator(num), m_denominator(den) {}operator double() const {return (double) (m_numerator / m_denominator);}private:int m_numerator;  // 分子int m_denominator;  // 分母
};Fraction f(3, 5);
double d = 4 + f;  // 调用operater double将f转换成double

double d = 4 + f;这一语句首先查找Fraction是否有重载操作符 operator + (double, Fraction) 的函数,由于没有,所以会调用转换函数operator double() const

这里主要是把 f 转换成一个double 值。

non-explicit-one-argument constructor

例子:

class Fraction
{Fraction(int num, int den=1) :m_numerator(num), m_denominator(den) {}Fraction operator + (const Fraction& f) {return Fraction(...);}private:int m_numerator;  // 分子int m_denominator;  // 分母
};Fraction f(3, 5);
Fraction d2 = f + 4;  // 调用non-explicit ctor将4转换成Fraction(4, 1),然后再调用operator +

构造函数虽然有two parameters(两个形参),但只有one argument,且构造函数前面没有explicit,所以叫做non-explicit-one-argument constructor。

这里主要是通过调用构造函数和通过重载操作符“+”,把4转换成一个Fraction对象。

conversion function vs. non-explicit-one-argument constructor

class Fraction
{Fraction(int num, int den=1) :m_numerator(num), m_denominator(den) {}operator double() const {return (double) (m_numerator / m_denominator);}Fraction operator + (const Fraction& f) {return Fraction(...);}private:int m_numerator;  // 分子int m_denominator;  // 分母
};Fraction f(3, 5);
Fraction d2 = f + 4;  // [Error] ambiguous

上述的代码会导致二义性的出现,即 可以将4转换成Fraction 也可以将f转换成double,与4相加得到一个double,然后再转换成Fraction

为了使得编译通过,可以将Fraction d2 = f + 4;改成double d2 = f + 4

explicit-one-argument constructor

class Fraction
{explicit Fraction(int num, int den=1) :m_numerator(num), m_denominator(den) {}operator double() const {return (double) (m_numerator / m_denominator);}Fraction operator + (const Fraction& f) {return Fraction(...);}private:int m_numerator;  // 分子int m_denominator;  // 分母
};Fraction f(3, 5);
Fraction d2 = f + 4;  // [Error] convertion from double to Fraction requested

由于在构造函数前面增加了explicit关键字,所以不能将4转换成Fraction类型;也不能先将f转换成double类型,与4相加后再将double转换成Fraction。

explicit这个关键字基本只出现在构造函数前面,意思是需要明确地需要调用这个构造函数才能调用,不存在暗中、自动的转换操作。

二、point-like class

(1)智能指针

关于point-like class 的设计,首先,其内必有一真正的指针,并且为了使得智能指针在使用时像正常指针一样,其设计中必须对操作符 *和->进行重载。

转载于:https://www.cnblogs.com/memory-niu/p/8371769.html

第四周笔记 c++ Boolan相关推荐

  1. (英文版)吴恩达机器学习第四周笔记

    Neural Network:Representation 这是我在coursera上看Andrew Ng的machine learning做的英文版笔记,可以帮助学英语的小伙伴熟悉熟悉一些专业术语在 ...

  2. 吴恩达神经网络和深度学习——第四周笔记

    Week 4 4-1深层神经网络 这是我们之前学过的逻辑回归和单隐藏层神经网络,如今我们要接触更深的神经网络,比如下图的双隐藏层神经网络和五层的神经网络: 首先,我们对深层神经网络进行一个符号约定: ...

  3. 第三周笔记 c++ Boolan

    本周主要学习了c++中类与类之间的关系,主要有: 1)继承(Inheritance): 2)复合(Composition): 3)委托(Delegation): 一.复合: 类 queue 里有 de ...

  4. 面向对象高级编程(上)-- 第一周学习笔记(Boolan)

    培养正规的.大气的编程习惯 一.C++简介 1,分类 C++分为基于对象和面向对象两种 基于对象是指简单的类定义,数据封装,没有类与类的联系,面对的是单一class的设计.又可细分为不带指针的类和带指 ...

  5. week 4 ridge regression

    coursera 上的 华盛顿大学 machine learning: regression 第四周笔记 通常, 过拟合的一个表现是拟合模型的参数很大. 为了防止过拟合 Total cost = me ...

  6. android fragment实例化,Android使得Fragment 切换时不重新实例化

    以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...

  7. 187_陈易奇_Java核心编程

    第一周笔记 一.源代码中重要组成元素 public表示访问说明符,表面该类是一个公共类,可以控制其他对象对类成员的访问. class 用于声明一个类,其后跟的字符串是类的名称. static 表示该方 ...

  8. 深度学习笔记 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换...

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  9. 深度学习笔记第一门课​第四周:深层神经网络

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

最新文章

  1. SQL Server 2012 OFFSET/FETCH NEXT分页示例
  2. 禁止Html5在手机上屏幕页面缩放
  3. SHUoj 字符串进制转换
  4. VC++ 利用PDB和dump文件定位问题并进行调试
  5. DelayQueue源码
  6. 转载 oracle12c 切换字符集
  7. create_metrology_model创建测量几何形状所需的数据结构(原理)
  8. java值栈_Struts2学习笔记-Value Stack(值栈)和OGNL表达式
  9. 实现⼀个简洁版的promise
  10. CVPR2017精彩论文解读:用于生物医学图像分析的精细调节卷积神经网络
  11. Android binder学习一:主要概念
  12. linux内核启动地址的确定
  13. docker之基础命令相关操作下
  14. Window系统: 解决 win xp系统 最新版QQ/TIM安装包 报错误 安装包可能被非法改动导致安装失败 云云.2021-02-15
  15. 【Luat-air105】8.1 camera拍照
  16. wma转mp3怎么弄_免费:如何把WMA转MP3格式
  17. win7调整屏幕亮度_win7系统设置护眼色后,不生效怎么办?
  18. 如何将pdf分割成一页一页的
  19. 【练习】基于Vue全家桶的仿小米商城系统
  20. Android画一条虚线

热门文章

  1. java 文件crc校验_Java 对文件进行 CRC32 校验
  2. ajax请求整理(一) 2021.05.12
  3. 接收请求参数及数据回显 2021-04-26
  4. nsga2代码解读python_python自动化办公系列 | python操作pdf—— PyPDF2 和 pdfplumber模块(1)...
  5. Python设置画布大小_Python第25课:海龟绘图_自定义函数的应用
  6. CSS3实现文字描边的2种方法
  7. 计算机网络实验五静态路由与RIP协议,实验锐捷实训8-1--配置静态路由和rip协议...
  8. 开发Flex for Android第一个ANE(ActionScript Native Extensions)本地扩展
  9. 选考技术考计算机二级,计算机二级选考什么最简单啊```
  10. java性能测试jmh