隐式的类类型转换

如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数。

能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。

例如,在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这两种类型向Sales_data隐式转换的规则。也就是说,在需要使用Sales_data的地方,我们可以使用string或者istream作为替代:

构造函数:Sales_data(const string &s);
Sales_data(istream &);Sales_data &combine(const Sales_data&);

string null_book="9-999-99999-9";

//构造一个临时的Sales_data对象

//该对象的units_sold和revenue等于0,bookNo等于null_book

item.combine(null_book);

在这里我们用一个string实参调用了Sales_data的combine成员。该调用时合法的,编译器用给定的string自动创建一个Sales_data对象。新生成的这个(临时)Sales_data对象被传递给combine。因为combine的参数是一个常量引用,所以我们可以给该参数传递以临时量

只允许一步类类型转换

编译器只会自动地执行一步类型转换。例如,因为下面的代码隐式地使用了两种转换规则,所以它是错误的:

//错误:需要用户定义的两种转换:

//(1)把“9-999-99999-9”转换成string

//(2)再把这个(临时的)string转换成Sales_data

item.combine("9-999-99999-9");

如果我们想完成上述调用,可以显式地把字符串转换成string或者Sales_data对象:

//正确:显式地转换成string,隐式地转换成Sales_data

item.combine(string("9-999-99999-9"));

//正确:隐式地转换成string,显式地转换成Sales_data

item.combine(Sales_data("9-999-99999-9"));

类类型转换不是总有效

隐式的类类型转换,布布扣,bubuko.com

时间: 2024-10-06 11:05:03

隐式的类类型转换的相关文章

【C++ Primer 第七章】 隐式的类类型转换

转换构造函数 转换构造函数:如果构造函数只接受一个实参,则实际上定义了转换此类类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数. 能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则. 例如,在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这两种类型向Sales_data隐式转换的规则.也就是说,在需要使用Sales_data的地方,我们可以使用string或者istream作为替代: 构造函数: Sales_

Scala隐式转换类遇到的问题

今天练习Scala的隐式转换类遇到的一个问题,测试代码如下: object ImplcitTest { def main(args: Array[String]) { import Context._ val person1 = User("zhangsan") println(person1.getStr()) val filePath = Thread.currentThread.getContextClassLoader.getResource("test.txt&qu

C#之隐式与显示类型转换

今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,"隐式转换"与"显示转换",然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问题. 那么,今天刚好有空来总结一下这两者之间到底存在着怎么样的关系. 先来看看如下几个问题: 我先定义了一个变量: string a = 5; 这个只要是有点常识的人都可以一眼看出问题所在. 然后在看看如下代码: double d1 = 5; float f1 = d1; 按我们所预料的那样,现在我们试着尝试

Scala隐式转换

概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.本文原文出处: http://blog.csdn.net/bluishglc/article/details/50866314 严禁任何形式的转载,否则将委托CSDN官方维护权益! 隐式转换有四种常见的使用场景: 将某一类型转换成预期类型 类型增强与扩展 模拟新的语法 类型类 语法 隐式转换有新旧两种定义方法,旧的定义方法指是的"impli

static_cast显示完成隐式转换

用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的: 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的. ②用于基本数据类型之间的转换,如把int转换成char,把int转换成

JAVA学习笔记-this隐式参数

this 是隐式参数, 类的方法调用时,会系统自动传递一个this的参数给方法.(这个参数是隐式传递的) 所以在方法里可以使用this这个参数. this在方法中表示对象. this(参数列表)可以在构造器里调用另一个重载的构造器 this主要在对象初始化里用的比较多,也即在构造函数里用的多 实际上 super也是作为一个隐式参数和this传递的

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

代码编译运行环境:VS2012+Debug+Win32 模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化.模板的实例化分为隐式实例化和显示实例化. 对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用).对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显

java this 隐式参数

第37级 this 是隐式参数, 类的方法调用时,会系统自动传递一个this的参数给方法.(这个参数是隐式传递的) 所以在方法里可以使用this这个参数. this在方法中表示对象. this(参数列表)可以在构造器里调用另一个重载的构造器 this主要在对象初始化里用的比较多,也即在构造函数里用的多 实际上 super也是作为一个隐式参数和this传递的

scala自定义隐式转换

Scala自定义隐式转换 一.编写隐式转换类 /** * Author Mr. Guo * Create 2019/4/20 - 17:40 */ object StringImprovments { implicit class StringImprove(s: String) { def increment = s.toString.map(c => (c + 1).toChar) } implicit class Intc(i: Int) { def xx = { Integer.pars