第四周笔记 c++ Boolan

从这周开始,进入了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

时间: 2024-10-27 01:09:37

第四周笔记 c++ Boolan的相关文章

第四周笔记 150206205

第四周笔记

第四周笔记——复制文件(可读时间)

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; public class CopyFile { /** * @param args */ public static void copy(File a,File b){ try { FileInputStream fis = new FileInputStream("a.mp3

第四周笔记150206304

第四周笔记 李红著 150206227

bash总结文档低四周笔记

1 vim 文件1 文件2 2 prev往前翻 next往后翻 3 vim -o/O 文件1.文件2  水平垂直显示屏幕 4 ^ w s 水平分割  ^ w.v将文件垂直分屏显示 5 讲其他文件内容填充至当前文件 :r .payh to somefiles 6 部分另存为  :w /PATH/ TO /SOMEFILES 7 bath特性 自定义命令 alias来查看命令 8 alise命令可以用来定义和显示命令的别名 私有bash的配置文件用于保存别名  ~/.bashrc 9 修改bash文

《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态. 而在相应的低级别执行状态下(用户态),代码的掌控范围会受到限制.只能在对应级别允许的范围内活动.系统容易崩溃. 在intel X86CPU有四种不同的执行级别0,1,2,3,linux只使用了0级和3级分别来表示内核态和用户态. 2.在linux内核代码

第三周笔记 c++ Boolan

本周主要学习了c++中类与类之间的关系,主要有: 1)继承(Inheritance): 2)复合(Composition): 3)委托(Delegation): 一.复合: 类 queue 里有 deque ,其中类 queue 为容器,其拥有了 deque,该种关系即为复合,表示 has-a.其两者一起出现. 从内存角度看待该种关系: 复合关系下的构造函数和析构函数: 构造函数由内而外: Container 的构造函数首先调用Component的默认构造函数,然后才执行自己.具体过程如下:注意

Linux课程学习之我思

陈民禾,原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解. 经过八周的学习,Linux课程告一段落,在这里,对之前的学习做一个汇总,也简单说一下自己的收获与遗憾. 一.博客笔记汇总 第一周笔记    标题:计算机是这样工作的                               链接:http://www.cnblog