c++ explicit
explicit主要用于指明类的单参构造函数的是显示调用的,而非隐式调用。
那么在这里什么是显示调用,什么是隐式调用呢?
来看一个显式调用的例子
#include<iostream>
using namespace std;
class A{
public:
A(double val) : m_val(val){} //一个参数(单参)的构造函数
double m_val;
};
int main(){
A a1(3.14); //显示调用一个参数的构造函数
cout << "a1.m_val = " << a1.m_val << endl;
cout << "_________________________________________" << endl;
system("pause");
return 0;
}
大多数情况下,我们通过显示调用来对对象进行赋值,不会有问题
但是由于存在隐式转换,下面来看看隐式转换和调用
#include<iostream>
using namespace std;
class A{
public:
A(double val) : m_val(val){} //一个参数(单参)的构造函数
double m_val;
};
int main(){
A a1(3.14); //显示调用一个参数的构造函数
A a2 = 2.56;
cout << "a1.m_val = " << a1.m_val << endl;
cout << "a2.m_val = " << a2.m_val << endl;
cout << "_________________________________________" << endl;
system("pause");
return 0;
}
上例中,A a2 = 2.56 就进行了一次隐式转换,转换方式为创建一个临时的对象,再进行赋值
A temp(2.56);
a2 = temp;
explicit关键字可以阻止构造函数的隐式转换,只对:只含有一个参数,或n个参数里面,有n-1个参数是带有默认值的构造函数才有效
error: conversion from ‘double’ to non-scalar type ‘A’ requested
可以看到,在我们添加了explicit关键字后,构造函数就不能再进行隐式转换了