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的主要内容,如果未能解决你的问题,请参考以下文章