c++11对构造函数多过一个参数用explicit

Posted 老虎中的小白Gentle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++11对构造函数多过一个参数用explicit相关的知识,希望对你有一定的参考价值。

explicit

这个关键字在C++1.0(C++11之前)就已经有了。但C++11提出, explicit for actors taking more than one argument。
例子1:(这个例子不太符合explicit)

#include <iostream>

using namespace std;

class P
{
public:
    P(int a, int b)
    {
        cout << "P(int a, int b)" << endl;
    }
    P(initializer_list<int>)
    {
        cout << "P(initializer_list<int>)" << endl;
    }
     explicit P(int a, int b, int c)
    {
        cout << "explicit P(int a, int b, int c)" << endl;
    }
};
void fp(const P&)
{

}
    P p1(77, 5); //P(int a, int b)
    P p2{ 77,5 }; //P(initializer_list<int>)

    P p3{ 77,5,42 };//P(initializer_list<int>)

    P p4 = { 77, 5};//P(initializer_list<int>)
    P p5 = { 77,5,42 };//P(initializer_list<int>),理论上是会报错的,但我在VS2017和qt5.9中可以编译过
    P p6(77, 5, 42);//explicit P(int a, int b, int c)

    cout << "---------------------------" << endl;
    fp({ 47,11 });//P(initializer_list<int>)
    fp({ 47,11,3 });//P(initializer_list<int>),理论上是会报错的,但我在VS2017和qt5.9中可以编译过
    fp(P{ 47,11 });//P(initializer_list<int>)
    fp(P{ 47,11,3 });//P(initializer_list<int>)
    cout << "---------------------------" << endl;
    P p11{ 77,5,42,500 };//P(initializer_list<int>)
    P p12 = { 77, 5, 42, 500 };//P(initializer_list<int>)
    P p13{ 10 };//P(initializer_list<int>)

    cout<<__cplusplus<<endl;//201103
    return 0;
    

例子2:

#include <iostream>

using namespace std;

class Complex
{
private:
    int real{};
    int imag{};
public:
    explicit //不加这个关键字下面不报错,加了就报错,信息如下图
    Complex(int re, int im=0):real(re),imag(im)
    {

    }
    Complex operator +(const Complex& x)
    {
        return Complex((real+x.real),(imag+x.imag));
    }
};

int main()
{

    Complex c1(12,5);
   //! Complex c2 = c1+5;  //error
}

出错原因:
在这里插入图片描述

explicit的作用

explicit的英文解释是明白的、明确的,不要让编译器给我自作主张进行隐式转换。一般只有构造函数才会用上这个关键字。

 //! Complex c2 = c1+5;  //error

这里如果构造函数不加explicit的话可以编译通过,是因为编译看5会想办法看能不能把5变成5+0i这样的复数。而加上explicit会报错是因为我们明确对拒绝了这种隐式转换。

以上是关于c++11对构造函数多过一个参数用explicit的主要内容,如果未能解决你的问题,请参考以下文章

每周小贴士#142:多参数构造函数和explicit

explicit构造函数

explicit构造函数

C++11 新特性 之 explicit关键字 - 显示构造与隐式构造

C++ explicit关键字详解

explicit关键字