|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.11.2010, 09:59 | #1 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Преобразование типов
Столкнулся с проблемой при изучении книги Лафоре ООП в C++. Имеется пример для перевода из метров в старую английскую систему(футы, дюймы). Сделано это через конструктор с одним параметром - количеством метров, из которых вычисляются эти самые футы.
Код:
Код:
Вроде бы вся фишка в const float MTF. Если const убрать, то работать будет. Тоже не пойму, почему? Подскажите, пожалуйста. |
20.11.2010, 10:03 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Все очень просто.
Код:
а вот это: Код:
|
20.11.2010, 16:14 | #3 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Хм...ну по логике вещей то так, в ошибке как раз об этом и говорится... Но почему тогда, если const float MTF тупо сделать неконстантным, то всё замечательно работает?
|
20.11.2010, 17:02 | #4 |
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Все действительно просто.
mid = 14.5 Что делает компилятор? Он ищет соответствующий оператор присваивания. Не находит. Пытается сделать неявное преобразование типов, для которого этот оператор существует. Делает: из 14.5 вызовом Distance(14.5) создает объект типа Distance (в данном случае компилятору это разрешено, так как конструктор не объявлен как explicit). Слева и справа находятся объекты одного типа. Копирующий оператор присваивания генерируется компилятором и существует всегда. Он тупо копирует данные-члены из одного объекта в другой. При этом будет перезаписано и значение MTF. Если MTF константа, то это недопустимо, поэтому возникает ошибка компиляции. Я доступно объяснил?) |
21.11.2010, 08:18 | #5 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Да, спасибо большое) Просто я ожидал в данном случае скорее ошибку типа Cannot modify a const object...
И вообще разве не лучше такую константу объявить как static, а не инициализировать её каждый раз в кострукторах? Не так ли? В продолжение темы возникла ещё проблема. Допустим есть два класса, во втором определён оператор преобразования. Вот код, классы по сути ничего не содержат, кроме конструкторов и перегруженных операторов с выводом сообщений, просто для демонстрации механизма. Код:
Код:
Последний раз редактировалось Stilet; 23.11.2010 в 08:58. |
22.11.2010, 15:01 | #6 | |||
Great Code Monkey
Форумчанин
Регистрация: 09.08.2007
Сообщений: 533
|
Цитата:
Цитата:
Цитата:
A = firstClass для краткости. Вы правы, но лишь отчасти. Да, по идее сперва должен неявно вызваться оператор преобразования, который сконструированный временный объект типа А передаст в соответствующий конструктор копирования, а после его выполнения этот временный объект будет уничтожен. И семантически ваша программа должна полагаться именно на это (то есть конструктор копирования должен быть доступен). Но реальность такова, что в целях повышения производительности стандарт позволяет компиляторам избегать создания временных объектов при соблюдении определенных условий: в данном случае соблюдается такое условие, что функция-член operator A() возвращает объект нужного нам типа - типа А. Это позволяет компилятору без создания временного объекта сразу сконструировать нужный объект в нужной области памяти в обход конструктора копирования (даже если этот конструктор что-то делает). Итак, operator A() не возвращает временный объект типа А, а конструирует объект типа А прямо в области памяти, соответствующей объекту f3. |
|||
23.11.2010, 08:11 | #7 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Круто) Спасибо за столь подробные объяснения, пойду разбираться дальше.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Преобразование типов | Ra88 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 22.07.2010 02:56 |
Преобразование типов | Aleksandra1990 | Общие вопросы C/C++ | 5 | 12.05.2010 17:32 |
Си. Преобразование типов | pif | Помощь студентам | 3 | 20.04.2009 13:54 |
Преобразование типов | DeFace | Общие вопросы C/C++ | 4 | 24.03.2009 17:06 |
Преобразование типов | Pronik | Общие вопросы Delphi | 2 | 12.06.2007 12:23 |