如果一个类有只有一个参数的构造函数或者有多个参数但是除了第一个参数外所有的参数都有默认值的构造函数,c++允许一种特殊的声明类变量的方式。
在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器
在编译的时候会自动进行类型转换,将对应于构造函数参数类型的数据类型转换为类的对象。
如果在构造函数前加上explicit修饰词,则会禁止这种自动转换,在这种情况下,即使讲对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。
explicit使用注意事项:
explicit 关键字只能用于类内部的构造函数声明上,explicit 关键字作用于单个参数的构造函数或者有多个参数但是除了第一个参数外所有的参数都有默认值的构造函数。
因为两个参数且没有默认值参数的构造函数没办法隐式的转换,即无法出现classtype classname = value;的情况(因为这样只能赋给一个值)。
class A
{
public:
A(int);
private:
int num;
};
int Test(const A&) // 一个应用函数
{
...
}
Test(2); // 正确
过程是这样的: 编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:
const A temp(2); // 从2产生一个临时A对象
Test(temp); // 调用函数
在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器
在编译的时候会自动进行类型转换,将对应于构造函数参数类型的数据类型转换为类的对象。
如果在构造函数前加上explicit修饰词,则会禁止这种自动转换,在这种情况下,即使讲对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。
explicit使用注意事项:
explicit 关键字只能用于类内部的构造函数声明上,explicit 关键字作用于单个参数的构造函数或者有多个参数但是除了第一个参数外所有的参数都有默认值的构造函数。
因为两个参数且没有默认值参数的构造函数没办法隐式的转换,即无法出现classtype classname = value;的情况(因为这样只能赋给一个值)。
class A
{
public:
A(int);
private:
int num;
};
int Test(const A&) // 一个应用函数
{
...
}
Test(2); // 正确
过程是这样的: 编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:
const A temp(2); // 从2产生一个临时A对象
Test(temp); // 调用函数