C++的隐式类型转换
作者:网络转载 发布时间:[ 2015/6/12 11:04:53 ] 推荐标签:开发语言 C++
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。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11