Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Конструктор |
Автор: medveghonka 10.6.2007, 19:32 |
Не могли рассказать про конструктор копирования и неинициализирующий конструктор?? |
Автор: Voldemar2004 10.6.2007, 19:57 |
medveghonka, а поиск для чего ? ![]() |
Автор: archimed7592 10.6.2007, 23:27 |
не слыхал о таком... ![]() |
Автор: zkv 10.6.2007, 23:28 |
я тоже ![]() |
Автор: BigHeart 11.6.2007, 02:21 | ||
нееее...
это просто конструктор, который ничего не инициализирует ![]() |
Автор: archimed7592 11.6.2007, 02:35 | ||
BigHeart,
|
Автор: apook 11.6.2007, 05:03 | ||||
пустой конструктор ![]()
|
Автор: zkv 11.6.2007, 06:05 |
apook, а пустой оператор обязателен внутри конструктора? ![]() |
Автор: apook 11.6.2007, 07:25 | ||
Но ведь пустой конструктор инициализирующий ничто получился, а это сходно по смыслу ничего не инициализирующий... |
Автор: JackYF 11.6.2007, 12:18 |
apook, он неявно вызовет конструкторы по-умолчанию полей данных. Так что... |
Автор: Voldemar2004 11.6.2007, 12:30 | ||
Может быть medveghonka спрашивает про конструктор по умолчанию? ![]()
|
Автор: apook 11.6.2007, 13:44 | ||
Скорее всего неинициализурующих конструктроро тогда получается не существует так называемый пустой конструктор инициализирует все данные члены класса нулями |
Автор: Fazil6 11.6.2007, 14:45 | ||
не факт. Зависит от того как определен конструктор и как объект создается |
Автор: apook 11.6.2007, 15:14 | ||||
Я имел ввиду конструктор по умолчанию который вызывается компилятором автоматически
Насколько я знаю ноль он и для строки ноль, а NULL название для удобства NULL-это ноль, вообще-то что то где-то слышал о том что NULL это не ноль, а вообще нкак-бы ничто пустота, но на деле мне кажется что NULL, это ноль да и опять-же попадалась такая информация, я конечно не берусь настаивать, но вот как можно забить так сказать пустотой(для строк) или нулями некую структуру неважно какого типа в ней данные... memset( structname, 0, sizeof(structname) ); |
Автор: archimed7592 11.6.2007, 15:23 | ||||||||
угу... речь не про char *, вообще то... ну да ладно
во-вторых, речь не о том, как это можно сделать, а про неинициализирующий конструктор. |
Автор: Fazil6 11.6.2007, 15:24 | ||||
|
Автор: Xenon 11.6.2007, 15:50 | ||
apook Ну у std::string нет коструктора с int, поэтому 0 простой не сгодится. А от такого прога вообще загнется ![]()
А на счет нуля - это ты читал на rsdn, но Visual Studio рассматривает это просто как define. И эти приколы с пустотами вроде только в С были. Добавлено через 4 минуты и 9 секунд А по поводу default-initialization и value-initialization http://rsdn.ru/Forum/Info/FAQ.cpp.newnnew.aspx |
Автор: dead_psh 11.6.2007, 16:21 | ||||
а копирующий конструктор это конструктор вида
а применяется например вот так
|
Автор: Xenon 11.6.2007, 16:23 | ||
... или
|
Автор: apook 11.6.2007, 16:35 | ||
Так что-же такое неинициализирующий конструктор? Если любой конструктор что-то инициализирует, то неинициализирующий конструктор -- это тот который не вызывается там где вроде-бы должен, короче его нету. ![]() Я прочитал половину книги "C++для чайников" и там узнал что конструктор по умолчанию вызывается C++ -ом для совместимости c Си и заполняет все нафиг нулями |
Автор: Xenon 11.6.2007, 16:39 |
apook, смотря для каких типов и какой ... вот здесь, говорю, написано http://rsdn.ru/Forum/Info/FAQ.cpp.newnnew.aspx |
Автор: archimed7592 11.6.2007, 16:41 | ||
такого не существует
хотя, не исключено, что ты просто из контекста выдрал - сказанное там справедливо для POD'ов(правда в Си, AFAIK, структуры не инициализировались нулями) |
Автор: Fazil6 11.6.2007, 16:43 | ||||
конструктор инициализирует только то, что указано в списке инициализации.
|
Автор: apook 11.6.2007, 16:57 |
to dead_psh кстати в копирующем конструкторе надо однако осуществить проверку на копирование себя |
Автор: Xenon 11.6.2007, 17:15 |
Fazil6, но вызванные конструкторы по умолчанию переменных-членов такую операцию произвести могут? Ну я не про POD естественно. То есть s в твоем случае должно быть иницилизировано чем-то, ведь и std::string есть конструктор по-умолчанию. |
Автор: Fazil6 11.6.2007, 17:42 | ||
ну есть конструктор пумолчанию у string ну и что? Никакого отношения к конструктору A1(){} он не имеет и значения внутри объекта s зависят только от конструктора string. В таком классе может быть точно такойже конструктор поумолчанию, который ничего явно не инициализирует и получить вполне мусорное значение в s. |
Автор: archimed7592 11.6.2007, 17:42 | ||
м.б. ты имеешь ввиду оператор присваивания? Добавлено через 1 минуту и 2 секунды имхо неявная инициализация не означает её отсутствия |
Автор: Xenon 11.6.2007, 18:02 |
Fazil6, ну все равно объект типа string сконструируется и будет неявная его иницилизация и утверждать, что тот конструктор класса ничего ЯВНО не иницилизирует, следовательно никакой иницилизация объектов не будет - нельзя, ведь тот же string будет проиницилизирован опираясь на свой конструктор по умолчанию и это будет неявной иницилизацией. Мусора-то при выводе я не вижу. Добавлено @ 18:03 apook, проверку на присваивание самому себе делают в operator = |
Автор: apook 11.6.2007, 18:19 |
Ну да а я что говорю, а ну = а что можно же.. а ну да, пойду ка отдохну лучше... |
Автор: BigHeart 11.6.2007, 23:18 |
ну хорошо. Допустим, мы не написали конструктор для класса, но во всех книгах написано, что если программист не создал конструктора, то компилятор его создаст самостоятельно. Какой код будет в этом конструкторе? всё поля инициализируется нулями? |
Автор: zkv 11.6.2007, 23:28 |
BigHeart, http://forum.vingrad.ru/index.php?showtopic=158618&view=findpost&p=1164731 уже дал Fazil6. |
Автор: Fazil6 12.6.2007, 01:07 | ||||
Вопервых если неопределен конструктор поумолчанию, то невсегда компилятор будет его генерить. Например, если определены другие конструкторы. Во-вторых при вызове конструктора поумолчанию значения полей пользовательских типов будут зависеть от их конструкторов поумолчанию. Поля встроенных типов будут содержать случайные значения, кроме случая когда объект создается выражением
и при этом конструктор поумолчанию отдан на откуп компилятору т.е. чтобы поля встроенных типов были гарантировано обнулены без списка инициализации нужно чтобы все звезды сошлись без вариантов. |
Автор: BigHeart 12.6.2007, 02:47 |
неее... Стоп. Мужчины, мы как бы начали с того, что нет такого определения, как неинициализирующий конструктор. ( по крайней мере про него никто не слышал ![]() Теперь мы разбираемся, может ли конструктор ничего не инициализировать, правильно? Добавлено через 2 минуты и 41 секунду и зачем ваабще он тогда нужен? |
Автор: BigHeart 12.6.2007, 03:13 | ||||
Харви Дейтел |
Автор: zkv 12.6.2007, 04:02 |
для того чтобы создать объект не инициализируя его при этом ![]() BigHeart, и к чему последние две цитаты? |
Автор: JackYF 12.6.2007, 14:10 |
Этого компилятор не делает точно. Кстати, для невстроенных типов данная операция очень может привести к невалидности данной переменной, то есть с ней невозможно будет работать. да, но куда ты этот ноль впихнешь? А NULL по значению 0 и есть. |
Автор: apook 12.6.2007, 14:50 | ||
Я извиняюсь зачем его куда-то впихивать, это не мое дело. к примеру
впихнул что-ли ![]() насчет невалидности Почему? Ведь параметр приводится к типу void т.е не зависит от типа данных |
Автор: JackYF 12.6.2007, 16:07 |
apook, я имел в виду std::string. Попробуй-ка его занули... Или попробуй инициализировать нулем. |
Автор: apook 12.6.2007, 16:23 |
Да здесь уже об этом говорили в самом начале |
Автор: Ulysses4j 12.6.2007, 16:45 |
Послушайте, может, я один какой-то ущербный: у меня такую строку, и VC 8.0, и MinGW компилируют прекрасно (на /W4 и -Wall, соответственно, ни одного предупреждения). А во время выполнения вылетают. |
Автор: archimed7592 12.6.2007, 16:53 | ||
ах, да... implicit constructor string::string(const char *). Ulysses4j, не волнуйся... ты не ущербный, но писать так всё равно не нужно...
|
Автор: medveghonka 12.6.2007, 16:57 |
Вопрос в точности звучал:дать определение неинициализирующего конструктора..... |
Автор: Xenon 12.6.2007, 17:28 |
Ulysses4j, ну именно с 0 скопилируется, только потом вылетит на этапе выполнения при попытке сделать strlen ![]() |
Автор: archimed7592 12.6.2007, 17:43 | ||
![]() |