c++中explicit关键字的含义和用法

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

如果c++类的构造函数有一个参数,那么在编译的时候 就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象 ,如下面所示:

class MyClass
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass

在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操 作:

MyClass temp(10);

MyClass obj = temp;

上面的 所有的操作即是所谓的"隐式转换".

如果要避免这种自动转换 的功能,我们该怎么做呢?嘿嘿这就是关键字explicit的作用了,将类的构造函 数声明为"显示",也就是在声明构造函数的时候 前面添加上explicit 即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构 造函数为显示的,那么下面的代码就不能够编 译通过了,如下所示:

class MyClass
{
public:
explicit MyClass( int num );
}
....
MyClass obj = 10; //err,can't non-explict convert

class isbn_mismatch:public std::logic_error{
public:
explicit isbn_missmatch(const std::string &s):std:logic_error(s){}
isbn_mismatch(const std::string &s,const std::string &lhs,const std::string &rhs):
std::logic_error(s),left(lhs),right(rhs){}
const std::string left,right;
virtual ~isbn_mismatch() throw(){}
};
Sales_item& operator+(const Sales_item &lhs,const Sales_item rhs)
{
if(!lhs.same_isbn(rhs))
   throw isbn_mismatch("isbn missmatch",lhs.book(),rhs.book());
Sales_item ret(lhs);
ret+rhs;
return ret;
}
Sales_item item1,item2,sum;
while(cin>>item1>>item2)
{
try{
   sun=item1+item2;
}catch(const isbn_mismatch &e)
{
   cerr<<e.what()<<"left isbn is:"<<e.left<<"right isbn is:"<<e.right<<endl;
}
}

时间: 2024-09-24 02:57:13

c++中explicit关键字的含义和用法的相关文章

Java中volatile关键字的作用与用法详解_java

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存. volatile 2个使用场景: 1.可见性:Java提供了volatile关键字来保证可见性. 当一个共享变量被volatile修饰时,它会保证修

Java中static关键字的作用和用法详细介绍_java

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

java中volatile关键字的含义

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块.

java super-java中super关键字的疑问

问题描述 java中super关键字的疑问 其实我想问的是为什么在静态方法中不能用super? 既然编译器规定我们不能在静态方法中使用super只能在实例方法中使用.而子类中的实例方法要调用只有等到对象产生后.但是我们都知道抽象类是不能被实例化的但是却能在其子类中调用其方法. 如果说super是指向父类的引用这个引用在虚拟机中是怎样形成的又是何时形成的? 解决方案 java中super关键字的使用JAVA中super关键字的用法Java中super关键字的三种用法 解决方案二: 静态字段.成员不

C++中的explicit关键字用法

但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的.了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用.既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用. 按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: (下面这个CExample没有什么实际的意义,主要是用来说明问题)  代码如下 复制代码 //Example.h #pragma once class

Java中final关键字的用法总结_java

1.final修饰类被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现细节也无法改变,无法被扩展.final类中的所有成员方法都会被隐式地指定为final方法,final类中的成员变量可以根据需要设为final. 2.final修饰方法一个类中的方法如果被final关键字修饰,则其子类无法覆写该方法,只能被子类继承.如果父类中的某个方法不想被其子类所覆写,可将该方法定义为final类型,另外,父类中的私有方法(即被privat

C++中explict关键字用法_C 语言

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. c++规定:对于可能只需传一个参数的默认构造函数,都定义了一种隐式调用. 注意:只需传一个参数不仅指的是只有一个参数的默认构造函数,也指那些包含了定义了参数默认值的那些默认构造函数. 举例说明: class MyClass { public: MyClass(); MyClass(string s); MyClass(int i, int y =

Python中super关键字用法实例分析

  本文实例讲述了Python中super关键字用法.分享给大家供大家参考.具体分析如下: 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(s

C#中的泛型,结合where的使用,new() struct 分别是什么含义,用法?

问题描述 C#中的泛型,结合where的使用,new() struct 分别是什么含义,用法? C#中的泛型,结合where的使用,new() struct 分别是什么含义,用法? 解决方案 new,约束一个无参数构造函数struct,表示泛型参数是一个结构体 解决方案二: C#中 as 和 is 分别是什么含义?dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解