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

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. python单元测试框架——pytest

    官网:https://docs.pytest.org/en/latest/ pytest帮你写出更好的程序 1.An example of a simple test:(一个简单的例子),命名为tes ...

  2. SQL学习笔记之简易ORM

    0x00 前言 1 .我在实例化一个user对象的时候,可以user=User(name='lqz',password='123') 2 .也可以 user=User() user['name']=' ...

  3. [Linux 006]——grep和正则表达式

    在使用系统时,我们或多或少的有一些搜索.查找的需求,必须要在文本中搜索某个关键字,或者过滤出文本中某些特定的行.grep 命令就为我们提供了这样一个功能,同时,grep 还可以使用正则表达式进行匹配, ...

  4. COGS314. [NOI2004] 郁闷的出纳员

    ★★★   输入文件:cashier.in   输出文件:cashier.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] OIER公司是一家大型专业化软件公司,有着数 ...

  5. ifconfig设置ip时出现提示 ifconfig: SIOCSIFFLAGS: Address not available

    一.笔者使用ifconfig观察网卡情况如下: root@jello:/# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:0 ...

  6. SaltStack配置salt-api第十二篇

    介绍 SaltStack官方提供有REST API格式的 salt-api项目,将使Salt与第三方系统集成变得尤为简单.本文讲带你了解如何安装配置Salt-API, 如何利用Salt-API获取想要 ...

  7. RedHat7.4最小化安装yum源不可用问题解决

    本次安装的RedHat7.4是安装在Oracle VM VirtualBox5.2.8虚拟机上面的,本文不对安装虚拟机步骤做详细说明. 工具准备: Oracle VM VirtualBox5.2.8 ...

  8. 【cs231n】神经网络学习笔记1

    神经网络推荐博客: 深度学习概述 神经网络基础之逻辑回归 神经网络基础之Python与向量化 浅层神经网络 深层神经网络 前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专 ...

  9. RocketMQ 自己的整理和理解

    每个人的想法不同, RocketMQ 介绍的时候就说 是阿里从他们使用的上 解耦出来 近一步简化 便捷的 目的当然是 让其能快速入手和开发 如果不是在项目设计层面上 只是使用的话 从Git上下载该项目 ...

  10. 测试php语句执行时间

    $start = microtime(true); $elapsed = microtime(true) - $start; echo "That took $elapsed seconds ...