1 | ||||||
Как работает компилятор при создании объекта25.10.2013, 13:06. Показов 2944. Ответов 36
Метки нет (Все метки)
Таки думал разобрался как работает конструктор копирования, а выходит, что нет.
Вопрост состоит в следующем. Имеем код представляющий собой класс для хранения указателей на строки которые хранятся в другом классе(суть в том что бы не хранить в памяти несколько копия строк если они идентичны): Кликните здесь для просмотра всего текста
Когда я в первый раз читал Лафоре этот код отлично компилился(в то время я работал в VS 6.0). В данный момент я программирую в среде Code::Blocks и в ней данный код не компилится. Ругается на неоднозначное определение конструктора. Вот отсюда и вопрос: А что собственно происходит при создании объекта? Когда запускается конструктор копирования, а когда конструктор с одним аргументом? Все это время я полагал, что сперва запускается конструктор копирования, а вот он в свою очередь вызывает конструктор с одним аргументом. Таки все же я не прав или как? Просвятите пожайлуста. Добавлено через 5 минут Странно. Конструктор копирования в VS не вызывается...
0
|
25.10.2013, 13:06 | |
Ответы с готовыми решениями:
36
Компилятор выдает ошибку при создании списка При объявлении объекта компилятор требует ';' При создании статического объекта получают различные адреса при различных обращениях Вылет программы при создании объекта |
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
25.10.2013, 13:13 | 2 |
0
|
25.10.2013, 13:17 | 3 | |||||
copy constructor применяется, например, так:
0
|
25.10.2013, 13:20 [ТС] | 4 | ||||||||||
Методом научного тыка выяснилось, что компилятор VS таки адекватно подходит к выбору конструктора:
Тута вызывется конструктор с одним аргументом:
Добавлено через 53 секунды Не. Перегрузка оператора тут не причем. Это разные вещи.
0
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
25.10.2013, 13:24 | 5 |
0
|
25.10.2013, 13:28 | 6 | |||||
Обычно GCC.
Ilot, ты много всего к кучу смешал. Давай рассмотрим вариант попроще:
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
25.10.2013, 13:47 | 8 | ||||||||||
Raali, Отнюдь, строка которая вы процитировали
Добавлено через 30 секунд novi4ok, Это не является вызовом конструктор копирования, это именно вызов оператора присваивания. Добавлено через 3 минуты Ilot, Код не будет компилироваться ни на одном нормальном компиляторе. Компилятор, даже если не вызывает конструктор копирования ОБЯЗАН проверить, что подходящий конструктор копирования существует. Здесь же, из-за того, что конструктор копирования принимает ссылку, нужного конструктора копирования нет, т.к. нельзя привести временный объект к ссылке (в MSVC это компилируется, потому что он допускает как расширение биндинг временного объекта к ссылке).
2
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.10.2013, 13:51 | 10 |
novi4ok, Да, извиняюсь, согласен, затормозил. Не заметил, что идет инициализация, а не присваивания уже созданному объекту.
0
|
25.10.2013, 13:54 [ТС] | 11 |
Мда castaway сделал как вы сказали заработало как я и говорил в первом посте. Т.е. сперва вызывается конструктор копирования, затем конструктор с одним аргументом. Насколько я понимаю конструктор копирования вызывается так как аргумент это константный указатель и конструктор копирования более подходит к данной ситуации. Однако почему в исходном варианте не вызывается конструктор с одним аргументом - ведь он в точности соответствует аргументам?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.10.2013, 13:57 | 12 |
Ilot,
Вообщем-то наоборот. Сначала с одним аргументом, а потом конструктор копирования с передачей в него вновь созданного объекта.
0
|
25.10.2013, 14:07 | 15 |
Да, мне тоже сначала так показалось.. Но по факту вызывается только один конструктор A( char * s ), что по-сути вроде как и является правильным. Зачем тут конструктор копирования?
Единственный момент, который еще следует поправить, так это изменить конструктор на A( const char * s ) Поправьте если в чем-то ошибся. Ilot, я предлагаю рассматривать вариант попроще, например мой, и уже от него отталкиваться.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
25.10.2013, 14:08 | 16 | ||||||||||
Ilot, Я говорю, что должно происходить по стандарту. Что вызывается в конкретной реализации меня мало интересует. Да и вообще по вашему скрину все так как я и сказал, сначала конструктор с одним параметром, потом конструктор копии.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||||||||||||
25.10.2013, 14:12 | 18 | |||||||||||||||
Конструктор копирования вызывается когда копируется объект например:
А неоднозначность от похоже простой пример есть допустим у объекта А конструктор преобразования из double и оператор приведения в double, и если мы запишем например что то врде так:
Все ошибки по неоднозначности легко устраняются применив явный вызов да и все.
0
|
25.10.2013, 14:18 [ТС] | 19 |
Уважаемый ForEveR может быть я не прав. Однако я считаю, что, пусть даже в вашем коде, сперва будет вызван конструктор копирования, однако встретив аргумент не соответствующий сигнатуре компилятор ищет подходящий конструктор в данном случае с одним аргументом (ук. на char). Поэтому сперва вызывается конструктор копирования, который в свою очередь вызовет конструктор с одним аргументом и затем управление снова вернется к конструктору копирования и будет выполнен его код. Вот именно поэтому сперва идет сообщение от конструктора с одним аргументом, а затем от конструктора копирования.
castaway, полностью с вами солидарен. Мне бы разъяснить, если вам не сложно, почему в этом случае выбирается конструктор копирования. Собственно я и просил вас об этом в 11 посте. Вот это я и спрашивал. Осталось только выяснить почему компилятор Code:Blocks'а ведет себе иначе...
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|||||||||||
25.10.2013, 14:21 | 20 | ||||||||||
Нет в твоем коде вызывается вначале конструктор преобразования, затем конструктор копирования, потом оператор присваивания.
Явно все вызови и голову не морочь перепиши эту строчку:
0
|
25.10.2013, 14:21 | |
25.10.2013, 14:21 | |
Помогаю со студенческими работами здесь
20
Ошибка при создании объекта класса Ошибка при создании объекта класса Undefined reference при создании объекта Ошибка при создании объекта класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |