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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringMVC框架–学习笔记(下)

    SpringMVC框架–学习笔记(下)

    2021年9月26日
    47
  • 最大矩阵和 leetcode_leetcode有效的括号

    最大矩阵和 leetcode_leetcode有效的括号给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。示例 1:输入:matrix = [[5,2],[1,6]], k = 1输出:7解释:坐标 (0,

    2022年8月9日
    8
  • css3 画半圆和1/4圆

    css3 画半圆和1/4圆

    2021年9月13日
    66
  • 51单片机4种流水灯

    51单片机4种流水灯4种流水灯:1、先从右到左逐个亮灭;再从左到右逐个亮灭;2、由两侧向中间,再中间向两侧亮灭;3、先右再左逐个亮起,不熄灭;再从左到右逐个熄灭;4、先左再右逐个亮起,不熄灭;再从右到左逐个熄灭;

    2022年5月1日
    55
  • 【合泰HT32F52352+oled温湿度显示】

    【合泰HT32F52352+oled温湿度显示】基于合泰 HT32F52352 oled 温湿度显示实验效果图本实验中 oled 和 dht11 的代码是移值之前 stm32 中的大部分都是一样只是在进行引脚初始化和相关时钟初始化有点区别 oled h ifndef OLED H define OLED H include ht32f5xxxx gpio h include stdlib h defineOLED MODE0 defineSIZE8 defineXLevel 0x00 defineX

    2025年12月1日
    4
  • malloc函数实现原理!

    malloc函数实现原理!任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很

    2022年5月31日
    44

发表回复

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

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