在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. Java与C++Socket通讯注意事项

    c++与java进行socket通信时注意事项 原文链接: http://my.oschina.net/ypimgt/blog/106439 因为java发送的都是网络字节序(big-endium), ...

  2. mysql中Table is read only错误解决方法

    今天再我把数据库data 拷贝到linux 下运行程序 ”mysql中Table is read only的解决“ 出现这样的问题,查询资料. linux下执行如下命令即可 #mysqladmin - ...

  3. shell curl 下载图片并另存为(重命名)

    curl -o fuck.png http://img30.360buyimg.com/imgzone/jfs/t19711/232/1837927836/150222/e4cd87bb/5ad990 ...

  4. Python 爬虫实例(14) 爬取 百度音乐

    #-*-coding:utf-8-*- from common.contest import * import urllib def spider(): song_types = ['新歌','热歌' ...

  5. mysql 大数据提取

    今天要重五百多万的一个数据库表 提取 大约五十万条数据,刚开始的解决思路是: 先把数据查询出来,然后再导出来,然后再设计一个数据库表格,把这些数据导入,最后导出数据和导入数据花费了很多时间,最后向同事 ...

  6. 启动和停止kafka 及kafka manager

    启动kafka: sh /app/pet_kafka_xxxx_cluster/bin/kafka-server-start.sh -daemon /app/pet_kafka_xxxx_cluste ...

  7. 各个框架下的aop

    http://www.cnblogs.com/neverc/p/5241466.html

  8. css3实现画对号动画

    目标:实现对号动画,慢慢画出来的感觉: 原理:外层div的背景是一个对号图片,用一个div做遮罩,让遮罩div层从左到右做运动一次即可实现动画,需要注意的是遮罩div的初始位置应该在外层div的外面: ...

  9. FFmpeg(12)-使用NDK通过GLSurfaceView完成视频的播放

    一.包含头文件和库文件 这里采用的是NDK中的ANativeWindow来完成视频的播放,因为需要添加相关的库和头文件. CMakeLists target_link_libraries( # Spe ...

  10. FFmpeg AVPacket和AVFrame区别

    简介 AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)