C++ 中 explicit关键字的作用

explicit作用:

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

explicit使用注意事项:

explicit 关键字只能用于类内部的构造函数声明上。

explicit 关键字作用于单个参数的构造函数。

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换

先来看下面一道例题:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. class B
  6. {
  7. private:
  8. int data;
  9. public:
  10. B()
  11. {
  12. std::cout<<"default constructor!"<<std::endl;
  13. }
  14. B(B &)
  15. {
  16. std::cout<<"copy constructor!"<<std::endl;
  17. }
  18. ~B()
  19. {
  20. std::cout<<"destructed!"<<std::endl;
  21. }
  22. B(int i) : data(i)
  23. {
  24. std::cout<<"constructed by parameter "<<data<<std::endl;
  25. }
  26. };
  27. B Play(B b)
  28. {
  29. return b;
  30. }
  31. int _tmain(int argc, _TCHAR* argv[])
  32. {
  33. B temp = Play(5); //这里发生了隐式转换;(B)5
  34. return 0;
  35. }

问题:

(1)该程序输出的结果是什么?为什么会有这样的输出?

(2)B(int i):data(i),这种用法的专业术语叫什么?

(3)Play(5),形参类型是类,而5是个常量,这样写合法吗?为什么?【英国著名图形图像公司A2008年面试题】

(1)程序的输出结果为:

  onstructedby parameter 5

copy constructor;//temp=b;

destructor;  //B b;

destructor;  // temp;

 

注:5首先转换成B类型,调用一个有参的构造函数,然后Play返回之后,局部变量b会被析构掉。整个程序返回后,temp会调用析构函数。

为什么只有一个构造函数呢???这里又设计到另外一个问题,等会儿在后面接着讲。

(2)带参数的构造函数,冒号后面是成员变量初始化列表(members initialization list)。

(3)合法。单个参数的构造函数如果不添加explicit关键字,会定义一个隐含的类型转换,调用了相应的构造函数。(从参数的类型转换到自己);添加explicit关键字会消除这种隐含转换。

但是如果添加了explicit关键字来修饰构造函数后:问题3将变得不合法!

如果是 explicit B(int i ):data(i);

那么问题三就变的不合法:必须传:

B play(5); 

没有加之前可以是:B play=B(5);

看下面的实例:

  1. class A //没有关键字explicit的类
  2. {
  3. public:
  4. int size;
  5. A(int _size)
  6. {
  7. size = _size;
  8. }
  9. };


如果没有explicit:

A a1(12);//OK

A a2=12;//OK  A a2=A(12);

A a3;  //error ,没有默认的构造函数;

a1=11;//OK

a2=13;//OK

a2=a1;//OK

BUT

如果加了explicit关键字:

  1. class A //有关键字explicit的类
  2. {
  3. public:
  4. int size;
  5. explicit A(int _size)
  6. {
  7. size = _size;
  8. }
  9. };


A a1(12);//OK

A a2=12;//error

A a3;  //error ,没有默认的构造函数;

a1=11;//error

a2=13;//error 不 能做相应的隐形的转换;

a2=a1;//error 如果重载了operator=就可以了;

  1. calss Cnum
  2. {
  3. public:
  4. int data;
  5. Cnum(int i):data(i)
  6. {
  7. cout<<"constructor"<<endl;
  8. };
  9. operator int()
  10. {
  11. return data;
  12. }
  13. int operator=( Cnum num)
  14. {
  15. int a;
  16. a=num.data;
  17. return a;
  18. }
  19. };
  20. Cnum num;
  21. num=100;

num=100; //先看看有没有operator=,若没有而进行隐式转换类型,在调用相应的构造函数;

int a=num; //运算符重载:

//

(0)

相关推荐

  • “C++动态绑定”相关问题探讨

    一.相关问题: 1. 基类.派生类的构造和析构顺序 2. 基类.派生类中virtual的取舍 二.测试代码: #include <iostream> class A { public: A ...

  • java中final关键字的作用

    final关键字可以用于三个地方.用于修饰类.类属性和类方法. 被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写): 对于被final关键字修饰的类属性而言 ...

  • 研究速递|小脑在人类大脑的进化中起了重要作用

    人脑的例证,小脑突出 图片来源:©SciePro / stock.adobe.com 什么是小脑?小脑的功能有哪些? 小脑是位于脑的后部的结构,在枕部和颞大脑皮层的下面.尽管小脑约占大脑体积的10%, ...

  • 数学教学中板书设计的作用

    教学是一门综合艺术,艺术必须富有美感.数学教学也要使学生富有喜闻乐见的美感,呈现给学生那些看到的.听到的.触摸到的,可联想到的,都要有一种美妙诱人的艺术魁力所在,才会启发引导学生去积极主动地学习,从而 ...

  • Java 中的关键字

    Java 中有多少个关键字,有大小写之分吗? Java 中有 48 个关键字在使用 + 两个保留关键字未使用,共 50 个关键字. Java 关键字全部都由是小写组成. Java 中保留关键字分别是哪 ...

  • 淮海战役中刘伯承起到什么作用?为何晚年不愿提起这场战役?

    中国近代史就是一部充满战争的历史,从1840年开始两次鸦片战争.中日甲午海战,八国联军进北京,辛亥革命,北伐战争,国共两党之间的斗争,抗日战争,以及解放战争,中国这片土地被战争所笼罩. 在那个时期,数 ...

  • 通俗讲解:Recycle在PEP教材中的意义和作用是什么?

    微友提问 凌老师,我想请教一下,Recycle在PEP教材中的意义和作用是什么? 您好!曾经有一个词放在凌哥的眼前,叫Revision, 凌哥我没有好好珍惜.等凌哥反应过来的时候,发现已经冒出了一个新 ...

  • 刘奎林:潜意识在认识中的地位和作用——兼评弗洛依德潜意识理论

    2015年01月04日 16:11 来源:原载<哲学研究>1998年第3期 作者:刘奎林 潜意识作为一种未被直接察觉到的意识,同显意识一样贯穿于人类意识发生与发展过程的始终,并以集人的生物 ...

  • 各种香料在卤水中的用量与作用是什么?

    我是木子,专业卤肉十余年,下面以我的真实经验详细地回答这一问题(一定要看到最后,干货满满). 我们常用的香料是指能够赋予食材辛.香.麻.辣.苦.甜等典型气味的可食用香料植物,用于卤水中,作用无外乎三种 ...

  • 安云武:《黄金台》中“小花脸戏”的作用

    <早安京剧>系列公众号,全天候陪您赏玩京剧-- 安云武:从<黄金台>谈京剧老生基本功 安云武:为什么用<黄金台>作为老生的开蒙戏? 安云武:详解<黄金台> ...