关闭

C++的隐式类型转换

发表于:2015-6-12 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yethyeth    来源:51Testing软件测试网采编

  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软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号