C++primer读书笔记9-转换和类类型

C++primer读书笔记9-转换和类类型

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

有时指定自己的类类型来表示某些类型的数据,如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));

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116820.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」

    华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」全是干货的技术号:本文已收录在【github面试知识仓库】,欢迎star/fork:https://github.com/Wasabi1234/Java-Interview-Tutorial内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着os和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定运行。不同JVM对于内存的划分方式和管理机制存在差异。结合JVM虚拟机规范,来探讨经典JVM内存布局。JVM运行时数据区.

    2022年5月24日
    35
  • vs2008中英文版下载-VS2008注册码序列号–vs2008激活成功教程方法[通俗易懂]

    vs2008中英文版下载-VS2008注册码序列号–vs2008激活成功教程方法[通俗易懂]vs2008中英文版下载-VS2008注册码序列号–vs2008激活成功教程方法一、VisualStudio2008TeamSuite(90天试用版)下载地址:1.VS2008英文版3.83GBISO文件http://download.microsoft.com/download/d/8/9/d89c9839-ac45-4a6c-b25f-2f60b190e356/VS20

    2022年8月10日
    4
  • hdu 1142_hdu1001

    hdu 1142_hdu1001【最短路问题】第一道最短路问题+DFS各种WARE还是在参照大神的代码的情况下 http://acm.hdu.edu.cn/showproblem.php?pid=1142只是照搬自己熟悉下过程dijkstra+dfs#include&lt;cstdio&gt;#include&lt;cstring&gt;#defineINF2000000000#defineN101…

    2022年10月1日
    0
  • 信息熵、信息增益、信息增益比「建议收藏」

    信息熵、信息增益、信息增益比「建议收藏」信息熵“信息熵”是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为pk(k=1,2,…,|y|),则D的信息熵定义为:Ent(D)的值越小,则D的纯度越高。如果上面的解释不容易理解,那么下面再通俗地解释一下:首先来看一下信息熵这个公式在数轴上的表示:可以看到,在概率为0.5的时候,信息熵是最大的(为1)。我们可以把信息熵理解为“不确定性”,当概率为0.5…

    2025年5月25日
    0
  • android生命周期有几种状态_两个activity跳转生命周期

    android生命周期有几种状态_两个activity跳转生命周期Androidactivity生命周期(一)转载请注明出处:http://blog.csdn.net/chenlinfeng772885775/article/details/53672919Activity是Android中一块非常重要的部分,负责了和用户的交互,是用户能直接体验到的部分,我们只有了解了Activity的生命周期,才能更好的在各种情况下使用他。首先,他的生命周期大概可以用下

    2022年8月16日
    1
  • 2d游戏shader(效果)

    Shader2D:一些2D效果的Shader实现包括:模糊,锐化,圆形裁剪,正六边形裁剪,圆角,UV动画,百叶窗,马赛克,浮雕,铅笔画,水彩画,灰化,老照片,饱和度,HDR,内发光,外发光,扭曲,旋涡,波浪,水滴散开等

    2022年4月11日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号