在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
#include <iostream>
using namespace std; class A
{
public: explicit A(int a)
{
cout<<"创建类成功了!"<<endl; } };
int main()
{ A a=;
return ;
}
上面的代码编译不成功,原因是当显式地定义了一个带一个参数的构造函数( 带explicit),必须要显示地调用构造函数, A a(); 如果不加 explicit的话 A a=; 实际的转换过程如下:
相当于直接调用A(); () explicit
explicit 只能用于类内部的构造函数声明上。
explicit 作用于单个参数的构造函数或者只有零个或一个没有默认值得多个参数的构造函数。

()何时用explicit

当我们不希望自动类型转换的时候用,其实标准库好多构造函数都是explicit的

比如说vector <int> ivec();  //这种定义看起来一目了然

不能写成vector <int> ivec=;//此种定义让程序员感到疑惑

()何时不用explicit

当我们需要隐式转换的时候

比如说String类的一个构造函数

String(const char*);

定义成这样的好处,在需要隐式转化的时候编译器会自动地帮我们转换,标准库里面的String就是一个好的证明。

具体来说:

我们可以这样String str="helloworld";//直接调用构造函数

String str="hello"+str+"world";

调用重载的+操作符号,此过程相当于:
String temp("hello"); //调用构造函数 String str=temp+str; String t("world");//调用构造函数 String str=str+t; 明白隐式转换在我们自己写类的时候,尤其是些操纵内存的类的时候很有用。 转载自:http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5644573
class Circle
{
public:
explicit Circle(double r) : R(r) {}
explicit Circle(int x, int y = ) : X(x), Y(y) {}
explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
private:
double R;
int X;
int Y;
}; int _tmain(int argc, _TCHAR* argv[])
{
//一下3句,都会报错
//Circle A = 1.23;
//Circle B = 123;
//Circle C = A; //只能用显示的方式调用了
//未给拷贝构造函数加explicit之前可以这样
Circle A = Circle(1.23);
Circle B = Circle();
Circle C = A; //给拷贝构造函数加了explicit后只能这样了
Circle A(1.23);
Circle B();
Circle C(A);
return ;
}
转载自:http://blog.csdn.net/just_a_beginning/article/details/4341999

C++中 explicit的用法的更多相关文章

  1. c++中explicit关键字用法

    C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...

  2. C++中explicit的用法

    https://blog.csdn.net/qq_35524916/article/details/58178072 https://blog.csdn.net/jinjin1062495199/ar ...

  3. STL中mem_fun, mem_fun_ref用法

    1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  6. SQL中distinct的用法

    SQL中distinct的用法   1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...

  7. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  8. jQuery中Animate进阶用法(一)

    jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...

  9. [转载]js中return的用法

    一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return;  在大多数情况下,为事件处理函 ...

随机推荐

  1. js html 页面倒计时 精确到秒

    <!doctype html> <html> <head> <meta charset="utf-8"> </head> ...

  2. Cg入门11:Vertex Shader - 几何变换 —MVP矩阵变换(旋转、缩放)

    旋转.缩放demo C# Code: Shader Code: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize ...

  3. centos 安装pecl

    一.更新yum源,安装php7 CentOS/RHEL 7.x: 1 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lates ...

  4. Java项目多数据源配置 (转)

    由于种种原因,有的时候可能要连接别人的数据库,或者不同的数据库没法自动转换,重构起来数据量又太大了,我们不得不在一个项目中连接多个数据源.从网上找了各种资料,只有这位大神给出的解决方案一下子就成功了. ...

  5. uefi+GPT分区安装ubuntu[zz]

    现状:1.预装win8的笔记本几乎都是uefi启动模式,配合GPT磁盘分区,于是遇到了“麻烦”不会装了,或者说按照老教程安装,结果失败了.而且有很多人在问怎么解决,其实网上就有嘛,关键词就是“uefi ...

  6. JavaScript面向对象:类、方法、属性

    JavaScript是一种基于对象的语言,与传统面向对象语言(C#.C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链继承).无论哪种形式的 ...

  7. 类里的通用成员函数应声明为static

    类C的成员函数f,如果f的实现实现不依赖于C的任何成员变量,则f为通用函数. 对于通用函数f,可以将其从类C中分离出来做成一个全局函数,也可以仍然让它属于类C,但加上static. 两种处理方法实际都 ...

  8. OOM killer(Out Of Memory killer)

    最近接连遇到两个情况就是接连进程把kill掉 第一个情况就是有一个java进程被kill了.原因是我这个服务器上海部署了一个node服务,这个node服务大家都不熟悉.所以在使用的时候没有注意内存的使 ...

  9. Libgdx之Music Sound 音效

    教程总文件夹: http://blog.csdn.net/zqiang_55/article/details/50878524 一个好的游戏.假设没有游戏音效那么这个游戏就过于简单乏味.Libgdx中 ...

  10. VS2010常用插件