技术在于交流、沟通,转载请注明出处并保持作品的完整性。

1.conversion function 转换函数

    //1.转换函数
//conversion function
//只要你认为合理 你可以任意写转换函数
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;
}; int main(int argc, const char * argv[]) { Fraction f(,);
double d = + f; //先找全局函数 operator+ , 发现没有,再去找 发现在 Fraction内找到了
cout<< d << endl;
cout<<sizeof(double) << endl; return ;
}

自动转换遵循以下规则:

1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

a.若两种类型的字节数不同,转换成字节数高的类型

b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

4)char型和short型参与运算时,必须先转换成int型。

5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

例如:

上面的  return ((double)m_numerator / m_denominator) ;

如果声明成这样 (double) (m_numerator / m_denominator) 会执行int类型的除法运算

所以要先将两个int型参数的一个转换成double型参数即可


2.non-explicit one argument ctor

explicit的作用,防止隐式转换,一般作用于带参数的构造函数

class Fraction
{
public:
Fraction(int num, int den = ):m_numerator(num),m_denominator(den){} // Fraction operator+(const Fraction & f)
{
cout << f.m_numerator<<endl;
return f;
}
private:
int m_numerator;
int m_denominator;
}; int main()
{
Fraction f(,);
Fraction d = f + ;//调用时会使 4 隐式转换成 Fraction //调用的过程也是先去找f的operator+函数 找到了 调用
return ;
}

输出结果

Fraction d = f + 4; 这个函数的意义是 f调用operator+ 参数为4

而接受端

你会发现4被隐式转换成 Fraction

Fraction operator+(const Fraction & f){...}

参数4就被隐式转换成Fraction

那么加上 explicit

class Fraction
{
public:
explicit Fraction(int num, int den = ):m_numerator(num),m_denominator(den){} // Fraction operator+(const Fraction & f)
{
cout << f.m_numerator<<endl;
return f;
}
private:
int m_numerator;
int m_denominator;
};

调用端


上面我提到两次 调用过程 那么如果将operator+  与 operator double() 连用的话会发生什么情况

class Fraction
{
public:
/*explicit*/ Fraction(int num, int den = ):m_numerator(num),m_denominator(den){} // Fraction operator+(const Fraction & f)
{
cout << f.m_numerator<<endl;
return f;
} operator double() const //注意看 没有返回类型,这个编译器会帮做,且防止我们声明错误 函数名就是返回类型
{
return ((double)m_numerator / m_denominator) ;//见下面自动转化规则
}
private:
int m_numerator;
int m_denominator;
};

编译会报错

参照<<侯捷 C++面向对象高级编程>>

C++面向对象高级编程(六)转换函数与non-explicit one argument ctor的更多相关文章

  1. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  2. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  3. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  4. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  5. C++面向对象高级编程(四)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...

  6. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

  7. C++面向对象高级编程(二)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...

  8. C++面向对象高级编程(一)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...

  9. C++面向对象高级编程(下)第一周-Geekband

    勿在浮沙筑高台 革命尚未成功,同志仍需努力 <h1> Conversion Function</h1> class Fraction { public: Fraction(in ...

随机推荐

  1. context.Request方法总结

    Request.Params为获取的包含上述两种集合外,还包括当前运行环境变量,COOKIES等的集合.Request.QueryString["param"] getReques ...

  2. Python3.x:SQLAlchemy操作数据库

    Python3.x:SQLAlchemy操作数据库 前言 SQLAlchemy是一个ORM框架(Object Rational Mapping,对象关系映射),它可以帮助我们更加优雅.更加高效的实现数 ...

  3. 创建squashfs

    SquashFS 通常的livecd都有一个这个文件,是核心的文件系统 SquashFS 也是一个只读的文件系统,它可以将整个文件系统压缩在一起,存放在某个设备,某个分区或者普通的文件中.如果您将其压 ...

  4. BZOJ3150: [Ctsc2013]猴子

    传送门 这题好神啊..好神啊.. 首先得到简单的DP方程: $f_{\{ i \}}=\frac{\sum_{i \ne j} f_ {\{ i,j \}} \times P_{(i,j)}}{N-1 ...

  5. VisualStudio下如何编译和使用最新版本的OpenCV(修正版)

    OpenCV是托管于GitHub的开源项目,本文具体解决一个问题,就是“获取最新版本的OpenCV,并且在自己的项目中使用起来"   最新版本 2017年3月31日 BY:jsxyhelu ...

  6. cogs 896. 圈奶牛

    ★★☆   输入文件:fc.in   输出文件:fc.out   简单对比 时间限制:1 s   内存限制:128 MB 描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必 ...

  7. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  8. 爬虫框架Scrapy之Spider

    Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及 ...

  9. Java的历史及发展

    Java之父:詹姆斯·高斯林 (James Gosling) Java自1995诞生,至今已经20多年的历史. Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语 ...

  10. 2017 ACM/ICPC 南宁区 网络赛 Overlapping Rectangles

    2017-09-24 20:11:21 writer:pprp 找到的大神的代码,直接过了 采用了扫描线+线段树的算法,先码了,作为模板也不错啊 题目链接:https://nanti.jisuanke ...