C++关键字之:explicit

一、文章来由

c++基础知识繁多,对于不太常用,易用错的关键字需要总结一下。

二、explicit关键字作用

(1)explicit关键字只是用来修饰构造函数的,而且它只会出现在类中的构造函数声明之前(定义之前再出现就错了)。

(2)explicit关键字是用来抑制由构造函数定义的隐式转换的。

三、构造函数定义的隐式转换

如下代码:

class MyClass
{
public:
  MyClass( int num );
}

MyClass obj = 10; //ok,convert int to MyClass

当定义了MyClass类的MyClass(int num);构造函数后,C++就允许最后一行的那种构造方法,这就叫做由构造函数定义的隐式转换

class MyClass
{
public:
  explicit MyClass( int num );  //add a explicit in front of constructor
}

MyClass obj = 10; //compiler error, implicit convert is not allowed now.
MyClass obj = MyClass(10); //OK, because this is a explicit convert.

当定义了explicit关键字后,隐式转换就会报错。这时只能使用显式转换 。

或者包装的再复杂一些:

#include <iostream>
using namespace std;

class Book
{
public:
    int num;
    Book(int n) {
        num = n;
    }

    Book() {
    }

protected:
private:
};

class Books
{
public:
    Book b;
    Books(Book tmp) {
        b=tmp;
    }
protected:
private:
};

int main()
{
    Books books(2); //此时可行

    return 0;
}

其实这里就是将2隐式转换成了Book类
但如果,将 Book(int n) 前加 explicit,就不能隐式调用了

四、使用注意

注意 :

explicit关键字只需要在类定义中的构造函数声明语句的头部书写,在构造函数的定义处不用写了。写了会报错。

使用的建议 :

如果没有很合适的理由说明必须使用隐式转换,而且如果你的构造函数是单形参可调用,那么最好声明explicit,这样可以避免错误。当然,多形参调用的构造函数是没有构造函数的隐式转换的,所以也没必要声明explicit。


参考资料

[1] http://blog.csdn.net/angeldragon/article/details/6429862#

时间: 2024-11-18 13:57:23

C++关键字之:explicit的相关文章

C++的explicit关键字的使用场景

假若我们定义了Str类如下结构 class Str { public: Str(int n) Str(const char* p) ..... } 可以使用如下方式来构建一个对象 Str c(12); Str d=Str(20); Str *z=new Str(21); Str a=10;//此处构建10个大小的空间 Str b="abcd";//此处构建特定字符串大小空间 Str f='f'; //与设计不相符的构建方式,这里会构建(int)'f'大小的内存空间 更多精彩内容:htt

C++知识点---explicit、TR1、Boost

关键字:explicit 1.除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit. 将构造函数设置为explicit可以避免错误,并且当转换有用时.用户可以显式地构造对象. 2.explicit关键字只能用于类内部的构造函数声明上.在类的定义体外部所做的定义上不再 重复它. 参考:<C++ Primer> 12.4.4 TR1 TRI ("Technical Report I") 是一份规范,描述加入 C++ 标准程序库的诸多新机 能.这些机能以新

excel提示用户定义类型未定义怎么办

  对象未定义时将产生此类错误: 一种典型的情况就是在定义对象时未正确创建对象本身而导致在编译时产生"用户定义类型未定义"的错误提示. 对此小编物提供以下通用定义外部对象的方法: Sub 定义并引用外部对象() 'Word后期绑定示例 Dim wdapp As Object Dim wd As Object Dim tb As Object Set wdapp = CreateObject("word.application") '打开一个word运用环境 wdap

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

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的, 既然有"显式"那么必然就有"隐式",那么什么是显示而什 么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候 就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象 ,如下面所示: class MyClass { public: MyClass( int num ); } .... MyClass obj = 10; //ok,convert int to

C++中的explicit关键字用法

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

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

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

C++ Explicit关键字详细解析_C 语言

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

关键字explicit

关键字只能用在类构造函数.它的作用是不能进行隐式转换. 1 class gxgExplicit //没有关键字explicit的类 2 3 { 4 5 public: 6 7 int _size; 8 9 gxgExplicit(int size) 10 11 { 12 13 _size = size; 14 15 } 16 17 }; 下面是调用 gxgExplicit gE1(24); //这样是没有问题的 gxgExplicit gE2 = 1; //这样也是没有问题的 gxgExplic

关键字explicit的用法

可能是我的C++基础不好,记不得explicit是干嘛用的了,所以网上搜了下,想想还是写下来,以免再忘,先来个例子,说明一下问题: test.cc: class A { public: A(int a) : data(a){} int data; }; class B { public: explicit B(int b) : data(b){}//就是这个了 int data; }; void func_a() { A a = 0; a = 1; } void func_b() { B b =