C++ 转换函数用法案例详解

1.标准数据之间会进行隐式类型安全转换,规则如下:

 在这里主要探讨c++中类类型与普通类型的转换:

1.类类型转换普通类型

class Fraction
{
public:
	Fraction(int num,int den=1);
	~Fraction();
    //转换函数
   /*
    转换函数语法规则:
     operator Type()
       {
      Type ret ;
      ........
       return ret;
    }
   */
	operator double() const {
		return (double)(m_Numerator*1.0 / m_Denominator);
	}
private:
	int  m_Numerator;
	int m_Denominator;
};

Fraction f(3, 5);
double d = 4 + f;//d=4.6

这里4+f,调用转换函数将f转换为0.6

2.普通类型转换为类类型(non-explicit-one-argument ctor)

class Fraction
{
public:
	Fraction(int num,int den=1);
	~Fraction();

	Fraction operator+(const Fraction& f) {
		return Fraction(this->m_Numerator * f.m_Denominator + this->m_Denominator * f.m_Numerator,
			f.m_Denominator * this->m_Denominator);
	}

private:
	int  m_Numerator;
	int m_Denominator;
};
Fraction f(3, 5);
Fraction d = f + 4;//调用+运算符函数,4会转为Fraction(4,1),含有接受一个参数的构造函数,否则也无法转换

3.同时含有转换函数和可以隐式的调用构造函数(转换构造参数)会报错

class Fraction
{
public:
   /*
    转换构造函数:
    -有仅有一个参数
    -参数是基本类型
    -参数是其它类型
   */
	Fraction(int num,int den=1);
	~Fraction();

	operator double() const {
		return (double)(m_Numerator*1.0 / m_Denominator);
	}
	Fraction operator+(const Fraction& f) {
		return Fraction(this->m_Numerator * f.m_Denominator + this->m_Denominator * f.m_Numerator,
			f.m_Denominator * this->m_Denominator);
	}
private:
	int  m_Numerator;
	int m_Denominator;
};

报错:   “Fraction::operator +”: 2 个重载有相似的转换    ,

所以在我们写构造函数都会使用关键字 explicit 防止类型隐式转换

class Fraction
{
public:

	explicit Fraction(int num,int den=1);
	~Fraction();
	operator double() const {
		return (double)(m_Numerator*1.0 / m_Denominator);
	}
	Fraction operator+(const Fraction& f) {
		return Fraction(this->m_Numerator * f.m_Denominator + this->m_Denominator * f.m_Numerator,
			f.m_Denominator * this->m_Denominator);
	}

private:
	int  m_Numerator;
	int m_Denominator;
};
Fraction f(3, 5);
Fraction d = f + 4;//报错:不存在从 "double" 转换到 "Fraction" 的适当构造函数
double d = f + 4;//可以,f转换

到此这篇关于C++ 转换函数用法案例详解的文章就介绍到这了,更多相关C++ 转换函数用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入讲解C++数据类型转换的相关函数的知识

    C++数据类型转换以及转换构造函数 标准数据类型之间的转换 在C++中,某些不同类型数据之间可以自动转换,例如 int i = 6; i = 7.5 + i; 编译系统对 7.5是作为double型数处理的,在求解表达式时,先将6转换成double型,然后与7.5相加,得到和为13.5,在向整型变量i赋值时,将13.5转换为整数13,然后赋给i.这种转换是由C++编译系统自动完成的,用户不需干预.这种转换称为隐式类型转换. C++还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一

  • C++中Operator类型强制转换成员函数解析

    类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换.转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型.转换函数又称类型强制转换成员函数,它是类中的一个非静态成员函数.它的定义格式如下: 复制代码 代码如下: class <类型说明符1> { public: operator <类型说明符2>(); - } 这个转换函数定义了由<类型说明符1>到<类型说明符2

  • C++常用函数之XML JSON格式转换问题

    数据格式在编程里面很常见,不同的系统都会有自己的标准.因为给有各的定义,每次做第三方开发系统对接的时候数据格式标准都是头疼的事情. 在开发过程中比较常见的比如有Json.XML.Key-Value等.这里我们就先看看Json和XML.两者的转换有很多开源的代码可以使用,而且也很完善,可以参考xml2json.xsltjson. XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿.这里可以查看XML的标准XML标准.在C++里面解析和操作XML的

  • C++ 转换函数用法案例详解

    1.标准数据之间会进行隐式类型安全转换,规则如下:  在这里主要探讨c++中类类型与普通类型的转换: 1.类类型转换普通类型 class Fraction { public: Fraction(int num,int den=1); ~Fraction(); //转换函数 /* 转换函数语法规则: operator Type() { Type ret ; ........ return ret; } */ operator double() const { return (double)(m_N

  • StretchBlt函数和BitBlt函数用法案例详解

    StretchBlt和BitBlt都用在双缓冲视图中,用来显示一幅图像 一.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩.也即是将内存中的位图拷贝到屏幕上,并且可以根据屏幕画图区的大小来进行伸缩,适应响应的屏幕(或图像控件) BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, in

  • C++ atoi()函数用法案例详解

    目录 1 功能 2 格式 3 注意事项 3.1 关于参数的注意事项 3.2 关于返回值的注意事项 3.3 判断转换是否成功 4 宽字符的转换 1 功能 atoi()函数将数字格式的字符串转换为整数类型.例如,将字符串"12345"转换成数字12345. 2 格式 该函数的格式为 int atoi(const char* str) 其中,参数str是要转换的字符串,返回值是转换后的整数. 3 注意事项 3.1 关于参数的注意事项 在"2 格式"中提到,atoi()函数

  • C++ seekg函数用法案例详解

    C++ seekg函数用法详解 很多时候用户可能会这样操作,打开一个文件,处理其中的所有数据,然后将文件倒回到开头,再次对它进行处理,但是这可能有点不同.例如,用户可能会要求程序在数据库中搜索某种类型的所有记录,当这些记录被找到时,用户又可能希望在数据库中搜索其他类型的所有记录. 文件流类提供了许多不同的成员函数,可以用来在文件中移动.其中的一个方法如下: seekg(offset, place); 这个输入流类的成员函数的名字 seekg 由两部分组成.首先是 seek(寻找)到文件中的某个地

  • Python threading Local()函数用法案例详解

    目录 前言 local() 函数是什么? local()函数如何用? 1. 不做标记,不做隔离 2.使用local()函数加以控制 3. 模拟实现local()的功能,创建一个箱子 4. 简化代码操作,进一步模拟实现local()函数 总结 前言 当多线程访问同一个公共资源时,如果涉及到修改该公共资源的操作就可能会出现由于数据不同步导致的线程安全问题.一般情况下我们可以通过给公共资源加互斥锁的方式来处理该问题. 当然,除非必须将多线程使用的资源设置为公共资源的情况.如果一个资源不需要在多个线程之

  • C++ assert()函数用法案例详解

    1. 简介 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行. 原型定义: #include <assert.h> void assert( int expression ); assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.请看下面的程序清单badptr.c: #include <stdio.h> #incl

  • SQL之patindex函数的用法案例详解

    语法格式:PATINDEX ( '%pattern%' , expression ) 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算. pattern字符串在expression表达式里没找就返回0,对所有有效的文本和字符串就是有效的数据类型. 描述一下此函数的具体用法: 1. PATINDEX ( '%pattern%' , expression ) '%pattern%'的用法类似于 like '%pattern%'的用法,也就是模糊查找其patte

  • Java ConcurrentHashMap用法案例详解

    一.概念 哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值. 哈希表(hash table):根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址. 二.HashMap与HashTable 1,线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CP

  • VBA数组用法案例详解

    目录 前言 具体操作 1.VBA数组的定义方法 2.数组的赋值和计算 3.数组的合并(join)与拆分(split) 4.数组的筛选(Filter) 5.数组维度的转换(Transpose) 6.利用数组获取所有工作表名称的自定义函数 7.数组赋值,提高计算效率 总结 前言 VBA数组在Excel开发应用中,作用还是很明显的,用好数组可以提高工作效率,下面就开始揭开VBA数组的神秘面纱. 具体操作 1.VBA数组的定义方法 下面是几种数组常用的定义方法,一维数组的定义.二维数组的定义 直接赋值定

  • C++ CopyFile,MoveFile用法案例详解

    1.含义 CopyFile(A, B, FALSE);表示将文件A拷贝到B,如果B已经存在则覆盖(第三参数为TRUE时表示不覆盖) MoveFile(A, B);表示将文件A移动到B 2.函数原型 CopyFile: MoveFile:     由函数原型可以看出,这两个函数的前两个输入参数都为LRCWSTR类型,如果我们定义的是char*,记得转换成LRCWSTR,否则会报错:     另外,这两个函数都返回一个bool型变量,表示执行成功与否,当目标位置路径不存在时,会return 0 3.

随机推荐