![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Привет всем есть вопрос по Copy Constructor. Допустим есть собственный класс String
Вопрос: Почему в Copy Constructore не нужно удалять нулевой симол "\0", создаваемый при инициализации объекта, в данном случае временного,(т.к мы возвращаем из String String::operator+(String& s) сопию s3) а сразу выделять для этого времнного объекта динамическую память? Это сообщение отредактировал(а) yngwie19 - 27.10.2008, 23:11 |
|||
|
||||
eyeofhell |
|
|||
Адепт ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.10.2008 Где: Россия, Москва Репутация: 1 Всего: 1 |
Уточните где имнно объект временный - в copy constructor или operator+ ? Это же разные функции. |
|||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
eyeofhell, в стоке 59 мы возвращаем копию локалного объета s3, тем самым main генерируется Конструктор копии.
|
|||
|
||||
eyeofhell |
|
||||
Адепт ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.10.2008 Где: Россия, Москва Репутация: 1 Всего: 1 |
Вопрос очень странный. Сперва про нулевой символ который зачем-то удалять, а потому сразу про этот временный объект. Что тут объекто-то? Нулевой символ? Он нифига не объект, он байт в строке. Конструктор копирования создает новый объект из существующего. Кроме случаев с '+', может быть использован например вот так:
Ноль в конец строки дописыают всегда чтобы можно было на эту строку вернуть указатель. Функции CRT, которые работаю с указателями на строку ( например, printf() ), по этому нулю длину строки определяют. Для них нет поля length класса String, им только указатель дают. Что происходит в s3 = s1 + s2: 1) выполняется s1.operator+( s2 ), который внутри себя создает на стеке новую строку s3(temp). 2) s1.operator+( s2 ) делает return s3(temp). При этом создается временная строка для которой вызывается конструктор копирования ( s3(temp) ). 3) s1.operator+( s2 ) выходит, созданная на стеке s3(temp) автоматически разрушается. 4) выполняется s3.operator=( временная строка ) 5) программа завершает выполнение строки кода s3 = s1 + s2, временная строка автоматически разрушается. Это сообщение отредактировал(а) eyeofhell - 28.10.2008, 00:05 |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
а вопрос не понят даже с пояснением |
|||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Ой ребят извените Я разобрался сам. Ну да немножко не понятно написал
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |