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));

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vue 往数组添加数据

    vue 往数组添加数据constnum1=[a,s,d]constnum2=[n,i,hao]for(letnofnum1){num2.push(n)}num2.push(…num1)

  • 久坐提醒电脑软件_久坐提醒app哪个好

    久坐提醒电脑软件_久坐提醒app哪个好下载废话不多说,先直接给出下载地址介绍久坐的危害不必多言,但工作起来很多时候总是不知不觉一坐几个小时不动地方。去年毕业前闲来无事写了个桌面端的久坐提醒小工具,放到github就没再管过,前些天发现这个仓库有了20个star了,虽然很少,但也蛮有成就感的。于是又有了更新的动力,根据issues里使用者提的建议,做了些小修改,提高了一些使用体验。截图展示…

  • 反转每对括号间的子串java_已知入栈序列求出栈序列

    反转每对括号间的子串java_已知入栈序列求出栈序列给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。示例 1:输入:s = “(abcd)”输出:“dcba”示例 2:输入:s = “(u(love)i)”输出:“iloveu”示例 3:输入:s = “(ed(et(oc))el)”输出:“leetcode”示例 4:输入:s = “a(bcdefghijkl(mno)p)q”输出:“apmnolkjihgfedcb

  • 我是如何学习和工作的(1) – 番茄工作法(1)[通俗易懂]

    我是如何学习和工作的(1) – 番茄工作法(1)[通俗易懂]我是如何学习和工作的(1) – 番茄工作法(1)

  • onResume的作用

    onResume的作用描述:今天在做一个功能的时候,从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,需要A能够进行刷新操作。但是默认跳回去的时候,A界面还是上次那个。解决方案:重写Aactivity的onResume()方法,在onResume()方面里进行刷新操作。因为按照activity的生命周期模型,当activ

  • JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    简单介绍JAVA虚拟机,安卓Dalvik虚拟机和ART虚拟机,并做简单对比。

发表回复

您的电子邮箱地址不会被公开。

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