关闭

C++隐式类类型转换

发表于:2015-2-03 09:30

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

 作者:青藜学士    来源:51Testing软件测试网采编

  C++可以定义如何将其他类型的对象隐式转换为我们的类类型或将我们的类类型的对象隐式转换为其他类型。为了定义到类类型的隐式转换,需要定义合适的构造函数。
  说明:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
  下面先看一个例子:http://blog.csdn.net/vagrxie/article/details/1586340
1 #include <string>
2 #include <iostream>
3 using namespace std;
4
5 class Fruit                                //定义一个类,名字叫Fruit
6 {
7     string name;                        //定义一个name成员
8     string colour;                        //定义一个colour成员
9
10 public:
11     bool isSame(const Fruit &otherFruit)   //期待的形参是另一个Fruit类对象,测试是否同名
12     {
13         return name == otherFruit.name;
14     }
15     void print()              //定义一个输出名字的成员print()
16     {
17         cout<<colour<<" "<<name<<endl;
18     }
19     Fruit(const string &nst,const string &cst = "green"):name(nst),colour(cst){}  //构造函数
20
21     Fruit(){}
22 };
23
24 int main(void)
25 {
26     Fruit apple("apple");
27     Fruit orange("orange");
28     cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl;  //没有问题,肯定不同
29     cout<<"apple = apple ?:"<<apple.isSame(string("apple"))<<endl; //用一个string做形参?
30
31     return 0;
32 }
  我们用string("apple")类型作为一个期待Fruit类型形参的函数的参数,结果是正确的。当把构造函数colour的默认实参去掉,也就是定义一个对象必须要两个参数的时候,文件编译不能通过。Fruit apple("apple")其实也已经有了一个转换,从const char *的C字符串格式,转为string。但apple.isSame("apple")这样调用肯定是错的,必须要用string()来先强制转换,然后系统才知道帮你从string隐式转换为Fruit。当然你也可以显式帮它完成,apple.isSame(Fruit("apple"))。
  可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数。explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义不再重复它。虽然不能隐式转换了,但显式转换还是可以的,例如:apple.isSame(Fruit("apple"))。
  说明:
  (1)显式使用构造函数只是终止了隐式地使用构造函数。任何构造函数都可以用来显式地创建临时对象。
  (2)通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。
  (3)将构造函数设置为explicit的好处是可以避免因隐式类型转换而带来的语义错误,缺点是当用户的确需要进行相应的类型转换时,不能依靠隐式类型转换,必须显式地创建临时对象。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号