Вопрос знатокам С++: Неявное преобразование типов

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

Имеется в наличии функция:

Код: Выделить всё

void ShowText( const String &s )
{
  MessageBox( NULL, s.c_str(), "", MB_OK );
}
Теперь вызовем эту функцию:
Вариант 1:

Код: Выделить всё

String str = "Hello world";
ShowText( str );
Вариант 2:

Код: Выделить всё

ShowText( "Hello world" );
Результат выполнения двух вариантов окажется эдентичным. С первым вариантом все понятно: отправляем в ф-цию объект класса String, а со вторым??? Ведь фактически в ф-цию отправляется указатель типа char, а не объект типа String.
Сложность - это мера непонимания.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Компилатор заменяет второй вызов на

Код: Выделить всё

ShowText(String("Hello world"))
А вообще, почитай Скотта Мейерса (Effective C++ & More Effective C++). Он такие ньюансы обсасывает очень хорошо.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Вот именно. Я бы тоже дал ссылку именно на эти книги. Масса тонкостей объяснены очень доходчиво и неспеша, сразу видно что труд ориентирован на медленно мыслящих американцев :) По поводу вопроса: Absurd сказал всё. Мне нечего добавить за исключением названия данной кострукции. Она носит название "Неявное преобразование типов".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить