|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||||||||||||||||
Компилятор просит указать const в конструкторе26.07.2012, 14:48. Показов 6305. Ответов 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 Подмена сайта вконтакт, просит указать номер телефона для отправки кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|