C++primer读书笔记9-转换和类类型
有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型
<1>转换操作符
operator type();
转换功能必须是一个类的成员函数,你不能指定返回类型。形參列表必须为空,而且通常不应该改变转换对象。所以操作符通常定义为const成员。
#include <iostream>
using namespace std;
class SmallInt
{
public:
SmallInt(int i=0):val(i)
{ if(i<0 || i>255) throw std::out_of_range("Bad SmallInt initializer");}
~SmallInt(void){};
operator int()const
{std::cout<<"Translate SmallInt to Int"<<endl;return val;}
private:
size_t val;
};
<2>2级转换
我们在SmallInt中指定的转换是int。可是SmallInt能够间接的转换为其它标准类型如double,float等
SmallInt sm;
double dv;
sm >= dv //sm convet to int and then convert to double
if(sm) //sm convet to int and then convert to bool
int x = static_cast<int>(si) + 2; // instruct compiler SmallInt to int
<3>禁止转换
如果另一个类Integral,它能够转换为SmallInt。可是它不能发生2级变换从Integral转换成SmallInt然后再转换成int类型。
int cal(int);
Integral intVal;
cal(intVal); //error,no convertion to int from Integral
总之:
SmallInt ->standard type ->standard type //ok
standard type ->standard type->SmallInt //ok
Integral->SmallInt->Int //error
在转换中仅仅能用到一个类类型转换(类类型<->标准类型。类类型<->类类型
<4>不要在一个类中指定多个类类型转换
这样可能会引起在一些转换时候的二义性。
class SmallInt
{
public:
SmallInt(int i=0):val(i){ if(i<0 || i>255) throw std::out_of_range("Bad SmallInt initializer");}
SmallInt(double db):val(db){}
~SmallInt(void){};
operator int()const{std::cout<<"Translate SmallInt to Int"<<endl;return val;}
operator double()const{std::cout<<"Translate SmallInt to double"<<endl;return val;}
private:
size_t val;
}; void fpComputer(float)
{}
SmallInt sm(100);
fpComputer(sm) //error
<5>构造函数转换二义性
void manip(const SmallInt&);
double d;
int i;
float f;
mamip(d); //ok,use SmallInt(double) to convert
manip(i); //ok,use SmallInt(int) to convert
manip(f); //error,ambiguous
<6> 构造函数转换和类类型转换同一时候存在时候的二义性
class Integral;
class SmallInt
{
public:
SmallInt(Integral);
//...
};
class Intergal
{
public:
operator SmallInt()const;
//...
}
void compute(SmallInt);
Integral intVal;
compute(intVal); //error:ambiguous
这里的Integral类型的变量intVal能够通过构造函数以及类类型转换两种方式转换成SmallInt。所以具有二义性
。详细的解决方法是通过显式方式调用例如以下所看到的:
compute(intVal.operator SmallInt());
compute(SmallInt(intVal));
版权声明:本文博主原创文章,博客,未经同意不得转载。
C++primer读书笔记9-转换和类类型的更多相关文章
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- 《C++ Primer Plus》读书笔记之九—使用类
第十一章 使用类 1.操作符函数的格式:operator op(argument-list).op是将要重载的操作符. 2.操作符重载函数的两种调用方式:①函数表示法:C=A.operator+(B) ...
- Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1
原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习. 1.HTML -- 见我前面文章 2.Interne ...
- C++ Primer 读书笔记 第2章 变量和基本类型
C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...
- 《C++ Primer》笔记 第7章 类
成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部.作为接口组成部分的非成员函数,它们的定义和声明都在类的外部. 定义在类内部的函数是隐式的inline函数. 成员函数通过一个名 ...
- C++ Primer 读书笔记 第1章
1.1 编写简单的C++程序 每个C++程序都必须包含一个main函数,因为main函数是系统执行入口,且main函数是唯一被系统显示调用的函数. 定义函数必须指定4个元素:返回类型.函数名.形参表. ...
- C++primer读书笔记11-多态
多态也是C++中的一个重要的方面.多态和动态类型,虚函数本质上是指同样的事情. 1 虚函数 类中的成员函数原型前面加上virtual 表面这个函数是个虚函数.虚函数的目的是为了在继承它的派生类中又一次 ...
- C++ Primer 学习笔记_5_变量和基本类型(续2)
变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...
随机推荐
- [Windows Phone]模仿魔兽3技能按钮SkillButton
简介: 模仿魔兽3技能按钮,带CD效果.使用的时候可以当做普通按钮使用,同时也支持Binding. 音效紧耦合在控件内部,因为控件本身目的就是模拟魔兽3的技能按钮,所以不考虑音效的扩展. Demo结构 ...
- 飘逸的python - yield简明教程
发现还有非常多人对yield不理解,云里雾里,于是试着用文字表述. 仅仅要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成 ...
- lua的table库中经常使用的函数
lua提供了一些辅助函数来操作table. 比如,从list中insert和remove元素,对array的元素进行sort.或者concatenate数组中的全部strings.以下就具体地解说这些 ...
- Enum的简单了解
Enum可以将一组具名的有限集合创建成一种新的类型,而这些具名的值可以作为常规的程序组件使用. 在创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum,所以enum本 ...
- oschina 编程语言
编程语言 Java C/C++ Objective-C PHP Perl Python Ruby C# .NET ASP Google Go D语言 Groovy Scala JavaScript T ...
- 你的App为什么上不了TOP10?
App市场风起云涌.但是,却仅仅有少数几个App能成为"暴发户",很多其它的则沉淀在应用商店中无人问津. 在移动互联网时代.智能手机成为了中心. 手机之所以智能.就在于手机上 ...
- hbase基本概念和hbase shell经常使用命令使用方法
HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用H ...
- JavaScript RegExp对象
一.什么是RegExp 1.RegExp 是正則表達式的缩写. 2.当您检索某个文本时,能够使用一种模式来描写叙述要检索的内容.RegExp 就是这样的模式. 3.简单的模式能够是一个 ...
- JAVA card 应用开发(三) 把APPLET(CAP文件)装载到卡片
依据前面两篇博文.我们能够在Eclipse上建立好Applet.而且能够有多个AID.能够选择不同的应用. 那么,以上我们都是基于模拟环境的逻辑,实际上有些函数接口是须要实际的环境.就是说我们须要把A ...
- poj1935(树形dp)
题目链接:http://poj.org/problem?id=1935 题意:带边权的树,给点一个根,问从根出发遍历某些点,所需的最小花费. 分析:树上任意两点的路径是唯一的,直接dfs一遍,可以得出 ...