关于语法:c ++中的显式关键字是什么?

What is the explicit keyword for in c++?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does the explicit keyword in C++ mean?

1
2
3
explicit CImg(const char *const filename):_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) {
  assign(filename);
}

有没有区别?


它用于修饰构造函数;这样修饰的构造函数不能被编译器用于隐式转换。

C++允许最多一个用户提供的转换,其中"用户提供"意味着"通过类构造函数",例如:

1
2
3
4
5
 class circle {
   circle( const int r ) ;
 }

  circle c = 3 ; // implicit conversion using ctor

编译器将在此处调用circle ctor,construcinmg circle c,其中r的值为3。

当你不想要这个的时候,使用explicit。添加显式意味着您必须显式构造:

1
2
3
4
5
6
 class circle {
   explicit circle( const int r ) ;
 }

  // circle c = 3 ; implicit conversion not available now
  circle c(3); // explicit and allowed

explicit关键字可防止隐式转换。

1
2
3
4
5
6
7
8
9
// 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*的构造函数)。有时这种隐式转换是不可取的,因为它并不总是有意义的。