2013-04-14 5 views
1

Я пишу c в течение нескольких лет, просто заходите на C++ для некоторых нужд! Моя книга - C++ Primer 5/e, и я дошел до темы о преобразовании конструктора и получил некоторые проблемыО кастинге в классе С ++

В C++ у нас есть много видов кастинга. как static_cast, dynamic_cast, и у нас также есть функция-кастинг, который является своего рода явным литьем.

class Sales_data{ 
public: 
    //C++11 feature,ask compiler to create a default constructor for us 
    Sales_data() = default; 
    Sales_data(const std::string &s, unsigned n, double p): 
     bookNo(s), units_sold(n), revenue(p*n); 
    explicit Sales_data(const std::string &s): bookNo(s){} 
    explicit Sales_data(std::istream&); 

    Sales_data combine(const Sales_data &item); 
private: 
    std::string bookNo;  // implicitly initialized to the empty string 
    unsigned units_sold; 
    double revenue; 
}; 

std :: string s is ISBN. , а четвертый читается ISBN от stdin

Я знаю, что без явного подтверждения следующие утверждения являются законными.

item.combine(string("ISBN NUMBER")); 
item.combine(cin); 

//error: need two conversion const char *->temporary string-> temporary Sales_item 
item.combine("ISBN NUMBER"); 

Я просто не понимаю, какие преимущества могут сделать два последних конструктора в явном виде?

http://www.cplusplus.com/reference/vector/vector/vector/

я не могу получить точку, почему некоторые из конструкторов вектора объявлены явно ?? Какова причина?

+2

Em, потому что действительно странно, что когда вы говорите 'do_something (5)' они означают передачу вектора с 5 элементами? – kennytm

+0

Ни одно из ваших «юридических» утверждений не является законным, потому что вы не можете привязать временную к неконстантной 'Sales_data 'reference в' comb() '. – chris

+0

@chris Они оба выглядят законными для меня ... первый передает временный const-ref, а второй pa ss - не временный (cin) по ссылке. – maditya

ответ

3

explicit запрещает вызов конструктора для автоматического преобразования. Конструктор все еще может использоваться как обычный конструктор. Да, язык должен был быть спроектирован так, чтобы иметь конструкторы explicit по умолчанию и аннотировать (implicit?) Конструкторы преобразования ... но так происходит история.

Причина, по которой std::vector<T>::vector(int) отмечен как явный, например, чтобы запретить следующий код:

void do_fancy_stuff(const std::vector<std::string> &data); 

do_fancy_stuff(20); 

Если вектор конструктор не явно будет использоваться для преобразования int к vector из 20 пуст строк, и это мало смысла.

Основная идея при написании конструктора TypeA::TypeA(TypeB x) является задаваться вопросом: «это конструктор преобразованияTypeB в TypeA или это просто используя x в качестве единственного параметра Если это последнее, добавьте explicit

?.
+0

Спасибо @rodrigo, можно ли открыть эту проблему каждый раз, когда мы проектируем наш класс? –

+2

@TimHsu: Ну, ищите какой-нибудь конструктор, который можно вызвать только с одним параметром и подумайте: «это оператор преобразования»?Если «да» ничего не делает; если «нет» добавить «явный». Если есть сомнения, просто добавьте его. – rodrigo

+0

«Если есть сомнения, просто добавьте его». Это хорошая рекомендация. –

Смежные вопросы