C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配
类型转换运算符
class SmallInt {
public:
SmallInt(int i = 0) : val(i) {
if (i < 0 || i > 255)
throw std::out_of_range("Bad SmallInt value");
}
operator int() const { return val; }
private:
size_t val;
};
在这个类中,类型转换运算符为
operator int() const { return val; }
operator Type() const;
Type表示除了void之外任意类型,只要该类型能作为函数的返回类型。因此,不允许转换成数组或函数。但是可以转换为指针或引用类型。
class SmallInt {
public:
int operator int() const; // 错误, 指定了返回类型
operator int(int = 0) const; // 错误, 参数列表不为空
operator int*() const { return 42; } // 错误,42不是一个指针
}
class SmallInt {
public:
SmallInt(int i = 0) : val(i) {
if (i < 0 || i > 255)
throw std::out_of_range("Bad SmallInt value");
}
explicit operator int() const { return val; }
private:
size_t val;
};
SmallInt si = 3; // 构造函数不是explicit的
si + 3; // 错误, 类型转换是explicit的
static_cast<int>(si) + 3; // 正确,显示的请求类型转换
while (std::cin >> value) ;
当cin读完值后,由于在while的条件部分,因此显示的类型转换被隐式的执行,cin转换为一个bool类型,用于判断是否读取成功。
避免有二义性的类型转换
struct A {
A() = default;
A(const B&);
};
struct B {
operator A() const;
};
A f(const A&);
B b;
A a = f(b); // 二义性错误
上面的代码中,发生了二义性错误,调用f函数时,既可以使用以B为参数的A的构造函数,也可以使用B当中把B转换为A的类型转换运算符。效果相当,因此出现二义性。
A a1 = f(b.operator A()); // 调用B的类型转换运算符
A a2 = f(A(b)); // 调用A的构造函数
struct C {
C(int);
};
struct D {
D(int);
};
void manip(const C&);
void manip(const D&);
manip(10); // 二义性错误,到底是manip(C(10))还是manip(D(10))呢
可以显示的调用:
manip(C(10));
struct C {
C(int);
};
struct E {
E(double);
};
void manip2(const C&);
void manip2(const E&);
manip2(10); // 二义性错误,是manip2(C(10)) 还是 manip2(E(double(10)));
class SmallInt {
friend SmallInt operator + (const SmallInt&, const SmallInt&);
public:
SmallInt(int = 0);
operator int() const { return val; }
private:
size_t val;
};
SmallInt s1, s2;
SmallInt s3 = s1 + s2; // 使用重载的operator +
int i = s3 + 0; // 二义性错误
C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配的更多相关文章
- C++ Primer : 第十四章 : 重载运算与类型转换之重载运算符
重载前须知 重载运算符是特殊的函数,它们的名字由operator和其后要重载的运算符号共同组成. 因为重载运算符时函数, 因此它包含返回值.参数列表和函数体. 对于重载运算符是成员函数时, 它的第一个 ...
- C++Primer 第十四章
//1.当运算符作用于类类型运算对象时,可以通过运算符重载重新定义该运算符的含义.明智的使用运算符重载能令程序更加易于编写和阅读. //2.重载的运算符是具有特殊名字的函数,它们由关键字operato ...
- 【C++】《C++ Primer 》第十四章
第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...
- C++ Primer Plus学习:第十四章
第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...
- C Primer Plus_第四章_字符串和格式化输入输出_编程练习
Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
- perl 第十四章 Perl5的包和模块
第十四章 Perl5的包和模块 by flamephoenix 一.require函数 1.require函数和子程序库 2.用require指定Perl版本二.包 1.包的定义 2.在包间切 ...
- Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
随机推荐
- CentOS----使用yum命令出现“could not retrieve mirrorlist http://mirrorlist.centos.org ***” - ybq155”
无聊安装了个mini版的32位的CentOS 6.5,进来想安装个东西,yum install emacs 提示什么 Loaded plugins: fastestmirror, refresh-pa ...
- XAF How to: 实现一个WCF Application Server 并配置它的客户端应用
本主题描述了如何实现一个 WCF 中间层应用程序服务器及如何配置 XAF客户端连接到此服务器. 注意 本主题演示可以由解决方案向导自动生成的代码.执行操作时,如果你想要在现有的 XAF 解决方案中实现 ...
- 解决T400\T500\W500等安装win10驱动后黑屏问题
T400.W500.T500等机型有双显卡的机型,在安装WIn10后会在驱动后黑屏,但可见启动画面: 原因:没有对应的双显卡驱动程序,导致系统无法正确识别显卡: 解决方法:开机按F1进入Bios,在显 ...
- java高薪之路__002_异常处理
自定义异常 package learn.JavaBasics.Class; import java.util.Date; /** * 如何自定义一个异常类 * 1. 继承一个现有的异常类 * 2. 提 ...
- jquery中通过全局变量来禁止多次ajax请求
var ajaxstate=false;//定义全局变量,通过这个变量来获得当前的ajax状态 $(function(){ $(document).ajaxStart(function(){ $(&q ...
- Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep ...
- python核心编程第六章练习6-11
6-11.转换.(a)创建一个从整型到IP地址的转换,如下格式:www.xxx.yyy.zzz.(b)更新你的程序,使之可以逆转换.[答案](a)代码如下: Input_number = abs(in ...
- 博客打开慢?请禁用WordPress默认的谷歌字体!
最近几天,谷歌中国挂了之后,发现我的博客打开极慢,原以为是空间问题,可一查,发现同台服务器的用户打开并不慢,排除了空间问题后,这边查询元素发现博客打开时加载了一个链接地址“fonts.googleap ...
- 最流行的JavaScript库jQuery不再支持旧版IE
直到JQuery2.0的发布,流行的jQuery JavaScript库到了一个重要里程碑.2.0版本比前任版本在大小上缩减了12%,但是更大的新闻是,jQuery 2.0不在对IE6,7,8三个版本 ...
- hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
因为n>1000000000所以用递归 数组超限, 由递归函数f(n)=(A*f(n-1)+B*f(n-2))%7; 因为是除7的余数 因次一共有7*7=49种情况, 以后的值都和之前的对应相等 ...