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. rabbitmq 学习足迹

    http://www.cnblogs.com/me-sa/archive/2012/10/20/RabbitMQ_VHost_Exchanges_queues_bindings_and_Channel ...

  2. Convert HTML to Text(转载)

    原文地址:http://www.blackbeltcoder.com/Articles/strings/convert-html-to-text  Download Source Code Intro ...

  3. 使用JDBC访问SQLServer 2008

    使用JDBC访问SQLServer 2008 // 准备数据库驱动程序 String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriv ...

  4. python2.7版本win7 64位系统安装pandas注意事项_20161226

    经过卸载安装python几经折腾,参考了各种网站,终于安装成功. [成功的步骤] 保存这个python第三方库网站,网址是http://www.lfd.uci.edu/~gohlke/pythonli ...

  5. 已解决: 已引发: "无法加载 DLL“opencv_core2410”: 找不到指定的模块。

    之前是win7 32位系统,程序运行没有问题:换了64位 win7后,系统就找不到opencv相关库了,网上各种查询解决方法,感觉不太可行,或者很麻烦...多次试验后,找到方便关键的解决方案如下: 计 ...

  6. ACM之路(20)—— Splay初探

    由于数据结构上老师讲了AVL树的rotate,然后去学了一下treap和Splay,这些数据结构还真是神奇啊! treap暂时只知道名次树的作用(就是一段动态变化的有序数列,找第K大的元素,用set显 ...

  7. C89和C99区别--简单总结

    (1)对数组的增强 可变长数组 C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变 ...

  8. cordova常用资料源

    cordova的中文资料https://github.com/CordovaCn/CordovaCn 官方文档: http://cordova.apache.org/docs/en/latest/ E ...

  9. [转载] 纯手打 第一篇:安装配置gradle

    本文转载自: http://www.cnblogs.com/uncle2000/p/4276833.html 一个bug 一个脚印的叫你们用gradle. 1介于网络上的很多资料都是老的 不适用与现在 ...

  10. swt controls里的控件list

    swt controls里的控件list,怎么显示滚动条,并且滚动条自动移动到最下边时,显示最新内容 package com.jokul; import org.eclipse.swt.widgets ...