有时指定自己的类类型来表示某些类型的数据,如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-转换和类类型的更多相关文章

  1. C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

    重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...

  2. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  3. 《C++ Primer Plus》读书笔记之九—使用类

    第十一章 使用类 1.操作符函数的格式:operator op(argument-list).op是将要重载的操作符. 2.操作符重载函数的两种调用方式:①函数表示法:C=A.operator+(B) ...

  4. Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1

    原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习.   1.HTML -- 见我前面文章 2.Interne ...

  5. C++ Primer 读书笔记 第2章 变量和基本类型

    C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...

  6. 《C++ Primer》笔记 第7章 类

    成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部.作为接口组成部分的非成员函数,它们的定义和声明都在类的外部. 定义在类内部的函数是隐式的inline函数. 成员函数通过一个名 ...

  7. C++ Primer 读书笔记 第1章

    1.1 编写简单的C++程序 每个C++程序都必须包含一个main函数,因为main函数是系统执行入口,且main函数是唯一被系统显示调用的函数. 定义函数必须指定4个元素:返回类型.函数名.形参表. ...

  8. C++primer读书笔记11-多态

    多态也是C++中的一个重要的方面.多态和动态类型,虚函数本质上是指同样的事情. 1 虚函数 类中的成员函数原型前面加上virtual 表面这个函数是个虚函数.虚函数的目的是为了在继承它的派生类中又一次 ...

  9. C++ Primer 学习笔记_5_变量和基本类型(续2)

     变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...

随机推荐

  1. SuSE(SLES)安装配置syslog-ng日志server,可整合splunk

    Update History 2014年04月25日 - 撰写初稿 引言 在自己主动化部署AutoYast.自己主动化监控BMC Patrol双方面形成雏形后.日志的收集.管理.分析也顺势成为我们须要 ...

  2. Android消息循环分析

    我们的经常使用的系统中,程序的工作一般是有事件驱动和消息驱动两种方式,在Android系统中,Java应用程序是靠消息驱动来工作的. 消息驱动的原理就是: 1. 有一个消息队列.能够往这个队列中投递消 ...

  3. iOS中的字符串NSString

    创建一个字符串对象: NSstring * str1 = @"hello world"; NSString * str = [[NSString alloc]initWithStr ...

  4. Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。

    后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.S ...

  5. C语言实现通讯录

    <span style="font-size:18px;">#include<stdio.h> #include<string.h> #incl ...

  6. 【VB/.NET】Converting VB6 to VB.NET 【Part II】【之四】

    第四部分 原文 DLLs, DAO, RDO, ADO, and AD.NET; the History of VB DBs In the early versions of VB, there we ...

  7. Datatables 在asp.net mvc

    Datatables 在asp.net mvc中的使用 前言 最近使用ABP(ASP.NET Boilerplate)做新项目,以前都是自己扩展一个HtmlHelper来完成同步/异步分页,但是有个地 ...

  8. hdu3038(并查集)

    题目链接 题意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的 分析:sum数组维护着到根节点的距离(即区间和),每次合并x,y,s(a,b分别为x,y的根节点 ...

  9. 西南民大oj(矩阵快速幂)

    我的名字不可能那么难记 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 16            测试通过 : ...

  10. Linux+Apache+Mysql+Php

    CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境 一.简介 什么是LAMP    LAMP是一种Web网络应用和开发环境,是Linux, Apache, My ...