Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Всем привет! У меня есть класс Person Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Оператор присваивание не объявлен явно, но я читал, что он все равно создается компилятором. В основном коде я создаю 3 объекта, а потом по одному записываю их в массив. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вот в этой строчке кода, я так понимаю, задействуется конструктор присваивания? Код: plaintext 1. И мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов? Я так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:22 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка char Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай об указателях, на пальцах это трудно объяснять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:30 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка char Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай об указателях, на пальцах это трудно объяснять. Сорри, я путаюсь в том, как правильно сформулировать вопрос. Я имел ввиду что этот указатель указаывает на массив из одной ячейки, и когда после операции присваивания, этот указатель указывает на массив из 5ти ячеек. А что случилось с памятью выделенной под массив из одной ячейки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА что случилось с памятью выделенной под массив из одной ячейки? Что случается с цифрой на часах, когда ты переводишь стрелку, которая на неё указывает? Ничего. Абсолютно ничего. Она по прежнему выделена, но теперь никто не знает где она. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:39 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GИ мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов?Нет, кусок памяти в один байт останется существовать, но никто более не знает где он находится поэтому и освободить его уже невозможно. Это потеря памяти в чистом виде. MaximuS_GЯ так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти.Нет, сообщения об ошибке ты не получишь. Деструктор удалит кусок памяти в пять байт, а про однобайтовый кусок все просто забыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:12 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:22 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_G Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Ну точнее, будут пытаться, если вы просто скопируете указатель при присвоении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:35 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonMaximuS_G Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз. Не совсем понимаю, почему объекты будут указывать на одну и ту же память? У них у каждого своя. А в конструкторе присваивания я использую метод strcpy, а не буду копировать указатели. Что я упускаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 23:12 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Вот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 23:18 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 00:41 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GВот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:03 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА в конструкторе присваивания я использую метод strcpy Тогда норм. Просто скопировать не догадываются чаще чем освободить. Копируют указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:48 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
egorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Спасибо за совет! Я даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:56 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
не бываетMaximuS_GВот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:05 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_Gне бываетпропущено... Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? Да. Везде конструктор копирования. T a = 1; эквивалентно T a(1); T b; T a = b; эквивалентно T a(b); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:09 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
эквивалентноT a = 1; эквивалентно T a(1); Точнее здесь параметризированный конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:10 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ?скорее, на такое: Код: plaintext 1. 2. 3. 4. если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 03:09 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
egorychMaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ?скорее, на такое: Код: plaintext 1. 2. 3. 4. если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой. Спасибо большое! Добавил в оператор присваивания :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:15 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
эквивалентноMaximuS_Gпропущено... Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? Да. Везде конструктор копирования. T a = 1; эквивалентно T a(1); T b; T a = b; эквивалентно T a(b); Я понял, спасибо большое! Вот таким образом Код: plaintext 1. я так понял можно инициализировать объект, если в параметризированном конструкторе один параметр. А если несколько параметров, можно как-то через равно инициализировать объект? Вот так, как со структурой, не получается. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:27 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
И еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример: Рассмотрим простой класс: Код: plaintext 1. 2. 3. 4. 5. 6. При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор: Код: plaintext 1. 2. 3. 4. Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:56 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют указатель. Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики ссылок или флаг владельца. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 13:26 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovEdd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют указатель. Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики ссылок или флаг владельца. А в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 16:37 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GИ еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример: Рассмотрим простой класс: Код: plaintext 1. 2. 3. 4. 5. 6. При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор: Код: plaintext 1. 2. 3. 4. Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста. То что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Аналог без класса: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 16:42 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
флаг владельцаА в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок? В моём собственном. Не требует ссылки на структуру. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 18:53 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=86&tid=2020538]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 145ms |

| 0 / 0 |
