C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡。

废话完后,讲讲自己捡到的石头:隐式类型转换

学习出处:《Effective C++》 lostmouse大人翻译

class TestInt
{

public:
    int GetData()const{ return i;};
    TestInt(int ii):i(ii){}; //构造函数

private:
    int i;

};

void fun(TestInt t)

{
    cout<<t.GetData()<<endl;
}

int main()

{

fun(10);

return 0;

}

运行结果:

10

为啥fun函数需要的是TestInt的类型的参数,而传进去int 也可以呢,

寻找原因之前,我们先把构造函数注释掉,再重新编译,结果这次直接报错error: conversion from ‘int’ to non-scalar type ‘TestInt

好像有点眉目了,之前能够调用成功估计和类的这个构造函数有关,其实这就是C++中的隐式类型转换:

编译器知道传个fun的值是int而函数需要的是TestInt,但他也同时知道调用TestInt的构造函数将int转换成一个合适的TestInt,

我们知道函数传值是会生成一个临时变量,现在的情况就类似 const TestInt t(10),所以结果就如上面所示。

《Effective C++》中一个例子:

class Month {
public:
  static const Month Jan() { return 1; }
 
static const Month Feb() { return 2; }
  ...
  static const Month Dec() {
return 12; }

int asInt() const           // 为了方便,使Month
  { return monthNumber; }    
// 可以被转换为int

private:
  Month(int number): monthNumber(number) {}

const int monthNumber;
};

一开始不明白如何调用这个类,而且对 static const Month Jan() { return 1; }

这个函数的返回值有很大的疑问,为啥返回类型是Month,但函数能返回一个int呢。

想不通,只好敲进编译器试错,经过一次次的出错,终于弄清这个类的用法,

其实这个类就是想得到一个const的月份:Month jan = Month::Jan(); 这样就得到代表一月份的对象。

而 static const Month Jan() { return 1; } 能够成功就是利用了隐式类型转换,只是现在的构造函数是

私有的,为的是防止用户创建新的month。

“只通过看游泳的书,并不能让你真正学会游泳”,编程也是如此。

C++的隐式类型转换的更多相关文章

  1. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  2. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  3. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  4. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  5. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  6. 【M21】利用重载技术避免隐式类型转换

    1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...

  7. JS--显示类型转换Number—隐式类型转换

    显示类型转换 (强制类型转换):Number()parseInt()parseFloat() Number是整体转换--能够把一个看起来像数字的字符串转成数字--尽量去转换能转的都转了 var a = ...

  8. Mysql隐式类型转换原则

    MySQL 的隐式类型转换原则: - 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 ...

  9. JavaScript之隐式类型转换

    布尔操作符(!.&&.||) 当使用 条件判断语句(if...else) 以及 布尔操作符(!.&&.||) 时,会调用Boolean()进行隐式类型转换 转换为fal ...

随机推荐

  1. php工作笔记6-手机端适应缩放

    1.静态页面

  2. spring注解记录

    集中记录spring常见注解 供今后查阅 @ControllerAdvice: ControllerAdvice的定义为: @Target(ElementType.TYPE) @Retention(R ...

  3. [小哥Allegro72讲速成视频]

    http://v.qq.com/vplus/df932a993679cf80a0b6c87bb849e22c 第01讲 Allegro常用组件介绍 视频链接:http://v.qq.com/boke/ ...

  4. 新建一个UI窗口-XproerUI(MFC)教程

    版权所有 2009-2015 荆门泽优软件有限公司 保留所有权利 产品首页:http://www.ncmem.com/apps/xproerui/index.asp 在线文档(XproerUI):Xp ...

  5. Qt界面对象的事件调用

    QMetaObject::invokeMethod(m_mainToolBarItem, "change2DesktopMode", Q_ARG(QVariant, m_curMo ...

  6. Linux 常用命令 :cd命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...

  7. [知识整理]Java集合(一) - List

    一.实现List的几个类: ArrayList.LinkedList.CopyOnWriteArrayList.Vector 二.几个List底层的数据结构: ArrayList - 数组列表 Lin ...

  8. miniui中常用的状态显示方式

    1.查询sys_code表得到对应的状态 考生状态:<input class="mini-combobox" style="" textField=&qu ...

  9. oracle字符查出一位

    select cast('a' as varchar2(64)) from dual;

  10. Interpreter(解释器)-类行为型模式

    1.意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.动机 如果一种特定类型的问题发生的频率足够高,那么可能就值的将该问题的各个实例表述为一个 ...