|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||||||||||||||||
Компилятор просит указать const в конструкторе26.07.2012, 14:48. Показов 6343. Ответов 33
Метки нет (Все метки)
Всем привет. Изучаю С++ по Р.Лафоре. В одном из заданий, к главе 8 понадобилось написать класс, представляющий простую дробь, и написать перегруженные операторы: -, +, * и /. Собственно проблем никаких - написал, перегрузил. Решил перегрузить заодно и оператор присваивания, путём указания соответствующего конструктора с одним аргументом того же типа:
Вот листинг программы целиком:
0
|
||||||||||||||||
| 26.07.2012, 14:48 | |
|
Ответы с готовыми решениями:
33
Что значит const в конструкторе класса?
|
|
|
|
| 26.07.2012, 15:01 | |
|
Ну тут все просто. Во первых "const" не обязателен можешь его убрать и убедиться в этом. А во вторых это такой синтаксис конструктора "копирования"(обрати внимание, а не присвоения).
/*конструктор копирования */ A(A&); /*оператор присвоения*/ A& operator = (A&); Добавлено через 3 минуты На примере A a(1); B b(a); /*вызываем конструктора копирования*/ C c; c = a; /*вызываем оператор присвоения*/
2
|
|
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||
| 26.07.2012, 15:58 [ТС] | ||
|
0
|
||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|
| 26.07.2012, 16:14 [ТС] | |
|
Я так понимаю, что пусть не явно, но объекты в С++ передаются в методы и ф-ции по ссылке, как и массивы?
0
|
|
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||
| 26.07.2012, 16:43 [ТС] | ||
0
|
||
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||
| 26.07.2012, 17:01 | |||
|
Добавлено через 4 минуты Добавлено через 10 минут Конструктор копирования вызывается всякий раз, когда создаётся новый объект, и инициализируется существующим объектом такого же типа. Когда генерируются копии объекта, например, когда в функцию объект передаётся по значению или функция возвращает объект. Когда нужны временные объекты, например, для хранения промежуточных результатов вычислений.
1
|
|||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|
| 26.07.2012, 17:15 [ТС] | |
|
Спасибо ребят большое - я вроде допетрил.
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 26.07.2012, 17:29 | |
|
moskitos80, в вашем коде явный конструктор копирования не нужен. Копирование полей num и den(поверхностное копирование) правильно сделал бы и конструктор копирования по умолчанию. Явный конструктор копирования нужен, например, в случае, если в полях класса присутствуют указатели, и тогда нужно выполнить, так называемое, глубокое копирование.
0
|
|
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||||||||||||
| 26.07.2012, 18:07 [ТС] | ||||||||||||
In member function `Fract Fract::lowterms()': no matching function for call to `Fract::Fract(Fract)' candidates are: Fract::Fract(Fract&) Но как это не найдено !? Если у меня явно в коде определен конструктор с соответствующей сигнатурой:
0
|
||||||||||||
|
|
|||||||||||||||||||||
| 26.07.2012, 18:47 | |||||||||||||||||||||
|
Допустим, так получится
0
|
|||||||||||||||||||||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|||||||
| 26.07.2012, 19:07 [ТС] | |||||||
![]() Кстати, то что временный, безымянный объект не получается преобразовать в ссылку - это по-человечески понятно (за это тоже спасибо - сам бы хрен догадался ) : к ссылке нужно через что-то обращаться, а в случае безымянного объекта - обращаться не через чего. Ну, это ладно, вопрос в другом ( теперь ) почему тогда "const" - работает? Ведь тут-то мы и приходим к:
![]() Чем больше я узнаю - тем больше понимаю, как мало я понимаю...
0
|
|||||||
|
|
|||||||
| 26.07.2012, 19:26 | |||||||
По поводу const, по идее его надо использовать везде, где не предполагается изменение данных. Конструктор копирования принимает ссылку на объект, из которого будет произведено копирование. Ясно, что этот объект изменять внутри функции ни в коем случае нельзя. Поэтому тут можно обезопасить себя от потенциальных ошибок с помощью const.
1
|
|||||||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|||
| 26.07.2012, 21:06 [ТС] | |||
|
А вообще всплывает закономерный вопрос: стоит ли изучать язык С++ не имея высшего образования! Здесь есть люди программирующие на С++ без вышки? Или я один пытаюсь выше головы прыгнуть?
0
|
|||
|
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
|
||||||||||
| 26.07.2012, 22:33 | ||||||||||
Добавлено через 55 минут
1
|
||||||||||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||
| 27.07.2012, 10:19 [ТС] | ||
|
Ведь в своё время - 3 года назад, когда начинал изучать php для меня массивы были чем то страшным и непонятным, циклы - вообще ужас а теперь я просто не представляю, как без всего этого жить. Потом был ООП - это по началу казалось чем то не постижимым, а теперь только его и использую (в больших проектах). Дальше - шаблоны проектирования Теперь понимаешь, что реализация - это вообще не проблема, а вот грамотно построить архитектуру это да... В общем, конечно всё по началу пугает... но мне кажется С++ как то особенно здесь не то что архитектура... блин простые вещи сделать - мозгов не хватает ![]() Добавлено через 11 часов 11 минут Нашёл ответы на свои вопросы здесь: http://ru.wikipedia.org/wiki/%... %B8%D0%B5) Конструктор копирования Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению. Конструктор копирования в основном необходим, когда объект имеет указатели на объекты выделенные в куче. Если программист не создаёт конструктор копирования, то компилятор создаст неявный конструктор копирования, который копирует указатели как есть, то есть фактическое копирование данных не происходит и два объекта ссылаются на одни и те же данные в куче. Соответственно попытка изменения «копии» повредит оригинал (!), а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе. Аргумент должен передаваться именно по ссылке, а не по значению. Это вытекает из коллизии: при передаче объекта по значению (в частности, для вызова конструктора) требуется скопировать объект. Но для того, чтобы скопировать объект, необходимо вызвать конструктор копирования. Тут ответы и почему по ссылке, и почему const Похоже тему можно закрывать.
0
|
||
|
|
|||||||
| 27.07.2012, 11:05 | |||||||
0
|
|||||||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|
| 27.07.2012, 11:26 [ТС] | |
|
Получается, что конечно изменить SimpleClass::rhs мы не сможем внутри конструктора, но скопировав некий адрес из rhs в ptr мы потенциально имеем возможность менять данные, которые содержит rhs - это что получается, что мы обходим const в сигнатуре конструктора? Или я опять всё не так понял?
0
|
|
|
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
| 27.07.2012, 12:30 | |
|
Тут о другом разговор. Если конструктор принимает константную ссылку на объект, это не значит, что сами данные этого объекта константны. Это только значит, что сам конструктор через эту ссылку не может менять объект. Я написал, что в вашем коде достаточно неявного констуктора копирования, который выполняет поверхностное копирование, т.е. просто копирует значения переменных одного объекта в другой. Проблема возникает с указателями, инициализированными оператором new. При поверхностном копировании, создаются копии указателей (адресов, которые они содержат), а не того, на что они указывают. Поэтому получается несколько объектов, с указателями, которые указывают на одну и ту же область памяти. Получаются, как бы, общие данные. Один объект, через указатели, меняет содержимое этой памяти, а другие объекты, и не знают об этом. При удалении одного объекта эта память освобождается. При удалении других, котрые содержат указатели на эту же память, делается попытка освободить уже свободную память, что приводит к ошибке. Поэтому, в этих случаях, задаётся явный конструктор копирования, который выполняет глубокое копирование, т.е. он копирует не указатели, а то, на что они указывают. После этого, у каждого объекта, указатели будут указывать на свою область памяти, со своими данными.
0
|
|
| 27.07.2012, 12:30 | |
|
Помогаю со студенческими работами здесь
20
Блокирует профили, и просит указать номер телефона Звуковая карта просит указать подключения колонок Непонятки с debug. Символы не загружены. Просит указать путь к файлу glut32.pdb Подмена сайта вконтакт, просит указать номер телефона для отправки кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
|