C++的隐式类型转换

摘要:
EffectiveC++Lostmouse,成人翻译,classTestInt{public:intGetData()const{returni;i(ii){}//构造函数private:10为什么有趣的函数需要TestInt类型参数?因此,这次直接报告错误。据估计,上一次调用的成功与类构造函数有关。编译器知道传递的fun值是int,函数需要TestInt。

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++的隐式类型转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vsftp 500 OOPS: cannot change directory:/home/通过docker安装elasticsearch和安装ik分词器插件及安装kibana下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++ Beep(发声函数)

c++ Beep(发声函数) Windows API 提供了一个奇妙的发音函数-Beep函数。Beep可以通过控制主板扬声器的发声频率和节拍来演奏美妙的旋律 Beep函数原型 BOOL Beep( DWORD dwFreq; DWORD dwDuration; ); dwFreq 指定要发出的频率(HZ) dwDuration 指...

浅谈js的几种模式(三)

  接着前面两篇,终于到了第三篇了,天真冷。   组合使用构造函数模式和原型模式   前面讲到了js中的原型模式,是为了解决不共享的问题,然而也因为原型模式的共享性带来了一些问题。原型中所有的属性,对它的实例都是共享的,但是有时我们希望每个实例中能有自己私有的属性,那么此时我们就要组合使用构造函数模式和原型模式。例:           function...

OpenGL 基础

1.OpenGL概念:  OpenGL可以说是一个图形软件开发包,一套函数库,或者一套API.它提供了100多个图形操作函数.2.OpenGL工作流程:  OpenGL独立于硬件,以流水线的工作方式.输入OpenGL的可以是图像或者几何元,最终结果都是光栅化后的图像.  对于图像,OpenGL首先通过像素解包把其像素格式转换成OpenGL内部格式,然后通过...

C89标准和C99标准C11标准的区别

转载 C89标准和C99标准C11标准的区别 C99对C89的改变 1、增加restrict指针  C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型...

标准Table.TransformColumns(Power Query 之 M 语言)

数据源:         任意数据源,其中有一列数值 目标:         对数值列进行四则运算等计算  操作过程:         选取待计算的数值列》【转换】》【标准】》选取    M公式:   = Table.TransformColumns( 表, {{"列名1", 转换函数1, 数据类型1},…,{"列名n", 转换函数n, 数据类型n}},...

sql server规范

常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint数据类型   (数据量一大,用int类型就装不下,那以后改造就麻烦了) 5.时间类型建议采用为datetime数据类型 6.禁止使用text、ntext、im...