C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
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的更多相关文章
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(二)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- C++面向对象高级编程(下)第一周-Geekband
勿在浮沙筑高台 革命尚未成功,同志仍需努力 <h1> Conversion Function</h1> class Fraction { public: Fraction(in ...
随机推荐
- 【MSDN_C#】C#版本介绍
C# 1,Visual Studio .NET 2002 首次发布 C# 1.1,Visual Studio .NET 2003 #line 杂注和 xml 文档注释 C# 2,Visual Stud ...
- Django学习笔记之Django的url反向解析
0x00 URL反向解析和三种不同的反向解析方式 Django中提供了关于URL的映射的解决方案,可以做两个方向的使用: 1.普通解析过程:由客户端的浏览器发起一个url请求,Django根据URL解 ...
- 20145324 Java实验五
1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者DES/AES或 ...
- JavaScript的this指针到底指向哪?
编程过程中,着实十分困扰this的指向性,经过查阅一番资料,终于搞清楚了,在这里总结一下,全文分为以下三个部分: 什么是this指针? this指针指向哪里? 何时使用this? 一 什么是this指 ...
- HBase安装过程
1).上传,解压,重命名,修改环境变量/etc/profile 2).修改 hbase-env.sh 文件 export JAVA_HOME=/usr/java/jdk1.7.0_27 //Java ...
- 1691: [Usaco2007 Dec]挑剔的美食家
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 621 Solved: 280[Submit][Status][Discuss] Description ...
- [译]JavaScript需要类吗?
[译]JavaScript需要类吗? 原文:http://www.nczonline.net/blog/2012/10/16/does-javascript-need-classes/ 译者注:在 ...
- nagios监控3306端口
1.修改 /usr/local/nagios/etc/objects/commands.cfg 添加一个服务名 # check port define command{ command_name c ...
- geoserver源码学习与扩展——跨域访问配置
在 geoserver源码学习与扩展——restAPI访问 博客中提到了geoserver的跨域参数设置,本文详细讲一下geoserver的跨域访问配置. geoserver的跨域访问依赖java-p ...
- PHP数据库链接类(PDO+Access)
PHP PDO Access链接 class DbHelpClass { private $conn; private $qxId; private $ret; function __construc ...