什么是在c + +明确的关键字?
可能重复:
C ++中的显式关键字是什么意思?
explicit CImg(const char *const filename):_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) {
assign(filename);
}
有或没有它有什么区别?
用来装饰构造函数; 一个如此修饰的构造函数不能被编译器用于隐式转换。
C ++允许最多一个用户提供的转换,其中“用户提供的”意思是“通过类构造函数”,例如:
class circle {
circle( const int r ) ;
}
circle c = 3 ; // implicit conversion using ctor
编译器会在这里调用circle ctor,为r
建立一个值为3的圆c
。
当你不需要这个时,使用explicit
。 显式添加意味着你必须明确地构造:
class circle {
explicit circle( const int r ) ;
}
// circle c = 3 ; implicit conversion not available now
circle c(3); // explicit and allowed
explicit
关键字可防止隐式转换。
// Does not compile - an implicit conversion from const char* to CImg
CImg image = "C:/file.jpg"; // (1)
// Does compile
CImg image("C:/file.jpg"); // (2)
void PrintImage(const CImg& img) { };
PrintImage("C:/file.jpg"); // Does not compile (3)
PrintImage(CImg("C:/file.jpg")); // Does compile (4)
如果没有explicit
关键字,语句(1)和(3)将被编译,因为编译器可以看到const char*
可以隐式转换为CImg
(通过接受const char*
的构造const char*
)。 有时候,这种隐式转换是不可取的,因为它并不总是合理的。