2010-07-18 4 views
5

Можно создать дубликат:
What does the explicit keyword in C++ mean?Что такое явное ключевое слово для C++?

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

какая разница с или без него?

+1

Возможный дубликат: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

ответ

4

Используется для украшения конструкторов; созданный таким образом конструктор не может использоваться компилятором для неявных преобразований.

C++ позволяет до одного предоставленного пользователем преобразования, где «Предоставленный пользователем» означает «с помощью конструктора класса», например, в:

class circle { 
    circle(const int r) ; 
} 

    circle c = 3 ; // implicit conversion using ctor 

компилятор будет вызывать круг CTOR здесь , constinmg circle c со значением 3 для r.

explicit используется, когда вы этого не хотите. Добавление явных означает, что вы должны явно конструкции:

class circle { 
    explicit circle(const int r) ; 
} 

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

Ключевое слово 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*). Иногда это неявное преобразование нежелательно, потому что это не всегда имеет смысл.