*** C++中explicit与隐式转换

    普通构造函数可以被隐式调用,而explicit构造函数(显式构造函数)只能被显式调用

关于隐式转换,参考:【转】这篇文章 

首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

《C++ Primer》中提到:

“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”

这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。

那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。

  1.   可以使用一个实参进行调用,不是指构造函数只能有一个形参。

  2.   隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。

  3.       explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)

#include <iostream>
#include <string.h>
using namespace std;
class Test1
{
public:
    Test1(int n) // 普通构造函数
    {num = n;}
private:
    int num;
};
class Test2
{
public:
    explicit Test2(int n) // (显式)构造函数
    {num = n;} 
private:
    int num;
};
int main()
{
    Test1 t1 = 1;
    Test2 t2 = 2; //编译错误
    Test2 t3(3);
    return 0;
}

 

posted @ 2018-12-23 18:44  super行者  阅读(367)  评论(0编辑  收藏  举报