C++中explict关键字用法

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

c++规定:对于可能只需传一个参数的默认构造函数,都定义了一种隐式调用。

注意:只需传一个参数不仅指的是只有一个参数的默认构造函数,也指那些包含了定义了参数默认值的那些默认构造函数。

举例说明:

class MyClass
{
  public:
    MyClass();
    MyClass(string s);
    MyClass(int i, int y = 0);
}

这里的MyClass(string s)函数和MyClass(int i, int y = 0)函数都是可能只需传一个参数的默认构造函数

看一下使用构造函数构造类对象的情况:

•MyClass obj1;//OK,调用了MyClass()

•MyClass obj2(string("Hello World!"));//OK,调用了MyClass(string s)

•MyClass obj3(12, 12);//OK,调用了MyClass(int i, int y = 0)

•MyClass obj4(12);//同上

•MyClass obj5 = 12;//同上。但是对于obj5,实际上等价于MyClass temp(12);MyClass obj5(temp);//也就是说默认调用了默认拷贝构造函数。这就是所谓的隐式调用。

大部分情况下,隐式调用都会产生bug,而且很难察觉。基于此,C++引入explict关键字关闭这种隐式调用,避免因为隐式调用而产生的bug。

时间: 2016-05-02

C++ Explicit关键字详细解析

explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字.首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用是不能进行隐式转换. 复制代码 代码如下: class gxgExplicit  //没有关键字explicit的类    {      public:          int _size;         gxgExplicit(int size)        {           _size = size;

MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数

安装MySQL时,有warning: [root@localhost mysql]# scripts/mysql_install_db --user=mysql Installing MySQL system tables...2015-08-13 14:20:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server

C++ explicit构造函数实例解析

按照C语言默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //- } String s1 = "hello"; //OK 隐式转换,等价于String s1 = String("hello"); 但是有的时候可能会不需要这种隐式转换,如下: class String { String

C++ explicit关键字的应用方法详细讲解

C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面

VBS教程:VBscript语句-Option Explicit 语句

Option Explicit 语句强制要求显式声明脚本中的所有变量. Option Explicit 说明如果使用 Option Explicit,该语句必须出现在脚本的任何其他语句之前. 使用 Option Explicit 语句时,必须使用 Dim.Private.Public 或 ReDim 语句显式声明所有变量.如果试图使用未经声明的变量名,则会出现错误. 提示 可用 Option Explicit 避免拼错已存在的变量名称.对于作用范围不清楚的变量,使用此语句可避免发生混淆. 下面例

VBS教程:VBscript语句-功能介绍

VBScript 语句描述语言元素将控制权交给一个 Sub 或 Function 过程.Call 语句声明一个类的名称.Class 语句声明用于替换文字值的常数.Const 语句声明变量并分配存储空间.Dim 语句当某个条件为 True 时或在某个条件变为 True 之前重复执行一个语句块.Do...Loop 语句重新初始化固定大小的数组的元素和释放动态数组的存储空间.Erase 语句执行一条或多条指定语句.Execute 语句在一个脚本的全局命名空间中执行一条或多条语句.ExecuteGlob

VBS教程:VBScript 语句-Sub 语句

Sub 语句声明 Sub 过程的名称.参数以及构成其主体的代码.  [Public [Default]| Private] Sub name [(  arglist)] [statements][Exit Sub][statements]End Sub 参数Public 表示 Sub 过程可被所有脚本中的所有其他过程访问. Default 只与 类块中的Public 关键字连用,用来表示 Sub 过程是类的默认方法. 如果在类中指定了不止一个Default过程,就会出错. Private 表示

VBS教程:VBScript 基础-VBScript 变量

VBScript 变量变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储脚本运行时可更改的程序信息.例如,可以创建一个名为 ClickCount 的变量来存储用户单击 Web 页面上某个对象的次数.使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值.在 VBScript 中只有一个基本数据类型,即 Variant,因此所有变量的数据类型都是 Variant. 声明变量声明变量的一种方式是使用 Dim 语句.Public 语句和 Priva

VBS教程:VBScript 基础-使用循环语句

使用循环语句循环用于重复执行一组语句.循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语句,另一类按照指定的次数重复执行语句. 在 VBScript 中可使用下列循环语句: Do...Loop: 当(或直到)条件为 True 时循环. While...Wend: 当条件为 True 时循环. For...Next: 指定循环次数,使用计数器重复运行语句. For Each...Next:对于集合中的每项或数组中的每个元素,重复执行一组语句.(

VBS教程:VBscript语句-Function 语句

Function 语句声明 Function 过程的名称.参数以及构成其主体的代码.  [Public [Default]| Private] Function name [(  arglist)][statements][name = expression][Exit Function] [statements][name = expression]End Function 参数Public 表示 Function 过程可被所有脚本中的所有其他过程访问. Default 只与 Class 块中

VBS教程:VBScript 基础-使用条件语句

使用条件语句控制程序执行使用条件语句和循环语句可以控制脚本的流程.使用条件语句可以编写进行判断和重复操作的 VBScript 代码.在 VBScript 中可使用以下条件语句: If...Then...Else 语句 Select Case 语句使用 If...Then...Else 进行判断If...Then...Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句.通常,条件是使用比较运算符对值或变量进行比较的表达式.有关比较运算符的详细信息,请参阅比

VBS教程:VBscript语句-On Error 语句

On Error 语句启用或禁用错误处理程序. On Error Resume NextOn Error GoTo 0 说明如果在您的代码中未使用 On Error Resume Next 语句, 所发生的运行时错误 将显示错误信息,同时,代码的执行也随之终止.但是具体操作由运行代码的主机决定.主机有时可有选择地处理各类错误.在有些情况下,它可以在出错的地方激活脚本调试器.而在另一些情况下, 由于主机无法通知用户,因此对所发生的错误没有明确说明.至于如何处理错误则完全取决于主机的功能. 在任意一

VBS教程:VBscript语句-For...Next 语句

For...Next 语句以指定次数重复执行一组语句. For counter = start To end [Step step][statements][Exit For][statements]Next 参数counter 用做循环计数器的数值变量.这个变量不能是数组元素或用户自定义类型的元素. start counter 的初值. end counter 的终值. step counter 的步长.如果没有指定,则 step 的默认值为 1. statements For 和 Next

VBS教程:VBscript语句-Exit 语句

Exit 语句退出 Do...Loop.For...Next.Function 或 Sub 代码块. Exit Do Exit For Exit Function Exit Property Exit Sub Exit 语句的语法有以下几种形式: 语句描述Exit Do提供一种退出 Do...Loop 语句的方法.只能在 Do...Loop 语句中使用.Exit Do 将控制权转移到 Loop 语句之后的语句.在嵌套的 Do...Loop 语句中使用时,Exit Do 将控制权转移到循环所在位置