2013-05-17 3 views
2

После прочтения конструктора преобразования я пришел к выводу, что это просто конструктор класса, который имеет один параметр. Это page объясняет это много, но я все еще смущен этим. Почему он используется?. До сих пор все, что я понимаю, что вместо того, чтобы объявить экземпляр в качестве такогоКакой смысл иметь конструктор преобразования

someclass a(12); 

мы могли бы сделать это как

someclass a = 12; 
+2

'std :: string s =" hello world ";' В таких случаях, как строки, более естественно использовать конструктор преобразования. Некоторые функции внедряются только для того, чтобы сделать синтаксис более приятным. – andre

+0

или 'ComplexNumber c = 5;' – Andrew

+0

Это также полезно, если у вас есть класс, который действует как число или значение. Например, высокоточный класс чисел, который вы можете преобразовать из int. –

ответ

5

Если у вас есть конструктор преобразования

SomeClass(int) 

, что означает, что функция

void foo(SomeClass x); 

может быть удовлетворено при вызове

foo(12); 

Это может или может не быть тем вы хотите. Ключевое слово explicit существует, чтобы избежать таких «неожиданных» преобразований.

+2

+1 для обозначения «явного» в качестве способа преодоления проблемы неявного преобразования. –

+0

Спасибо за краткое описание и получите значение через – MistyD

6

Его также полезно (dangerious), потому что он может автоматически преобразовывать аргументы.

void print(std::string const& str) 
{ 
    std::cout << str << "\n"; 
} 


int main() 
{ 
    print("Hi"); // That's not a string. 
        // But the compiler spots that std::string has a single 
        // argument constructor that it can use to convert a 
        // `char const*` into a std::string with. 
} 

Это, в основном, позволяет сделать язык более простым для записи (чтения).

Существует неудачный побочный эффект (который они заметили после факта). То, что компилятор преобразует то, что вы не хотите преобразовывать автоматически. Не могу думать об одной из рук. Но они существуют. В результате они добавили ключевое слово explicit для конструкторов. Это предотвращает автоматическое преобразование компилятора (как вам нужно явно его вызывать).

Благодаря @Mooing Duck

int main() 
{ 
    std::vector<int> names = 3; // What does this mean? 
            // This does not compile because of the explicit keyword now. 
            // But it used to compile and the meaning is not obvious. 

    // It gets even worse if you think about a function that takes a vector 
    plop(3); // Do you want that to auto converted into an std::vector<int>? 
       // Would you not want a compiler error? 
} 
+1

без ключевого слова 'explicit',' std :: vector names = 3; 'скомпилировал бы:/ –

3

Это становится полезным, когда вы хотите сделать неявные преобразования. например

struct A { 
    A(int i) : i(i) {} 
    A() : A(0) {} 
    int i; 
    A operator+(const A& a) { 
     return A(i + a.i); 
    } 
}; 

void f(A a) {} 

int main() { 
    A a(1); 
    A c = a + 2; // This wont be possible with out the implicit conversion of 2 to A 
    f(3);   // This wont be possible with out the implicit conversion of 3 to A 
} 
+1

Полезно? Проверьте. Потенциально опасно? Двойная проверка. –

+0

Да. Без сомнения, это опасно. Но это был просто пример использования. Меня лично это не сделало. – stardust

+0

Как и многие особенности C++. Напомним, что он был разработан для профессионалов, согласно Stroustrup. Если вы собираетесь использовать функцию GTFO, пока не научитесь правильно ее использовать;) – bstamour

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