| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Ошибка в коде |
| Автор: Competitor 1.1.2006, 15:59 | ||
Подскажите, где ошибка?
|
| Автор: Partizan 1.1.2006, 16:16 | ||
| не позволительны конструкторы типа ClassName(ClassName) нужно использовать ClassName(const ClassName&), то есть в твоём конкретном случае нужно писать так :
|
| Автор: Partizan 1.1.2006, 16:28 | ||
Но вообще говоря в твоём случае я бы использовал только конструктор Name1(int), просто передавал бы в ob2 ob1._int:
А такие конструкторы типа Name1(const Name1&) вообще используются для замещения конструктора копирования по умолчанию, который осуществляет всего навсего поверхностное копирование, создавая побитовую копию объекта, которая вряд ли будет пригодной, если в классе содержатся указатели или ссылки. |
| Автор: Daevaorn 1.1.2006, 19:52 | ||
Первая часть этого предложения в корне не правильная. Не "поверхностное" или "побитовое"(хорошее слово!:)), а хорошее: с вызовом конструкторов копирования полей данного класса. А вот если среди полей указатели и ссылки, то конечно будут проблемы. |
| Автор: Partizan 1.1.2006, 20:20 |
| Это не я придумал...терминология такая... я лично всегда думал и продолжаю думать, что в С++ различают т.н. "поверхностное" и "глубинное" копирование данных. При "поверхностном"происходит передача только адреса от одной переменной к другой....в результате обе переменных указывают на одну и ту же область памяти...При т.н. "Глубинном" копировании происходит действительное копирование данных из одной области в другую... Конструктор копирования по умолчанию производит поверхностное коепирование в вышеуказанном смысле... ещё раз говорю, что термины поверхностное и глубинное копирование придуманы не мной... |
| Автор: Daevaorn 1.1.2006, 20:29 |
| Partizan Я с терминологие не спорю. Просто называть "поверхностным", а уже тем более "побитовым" копирование, которое осуществляется через вызовы конструкторов копирования у объектов - это как то не хорошо. |
| Автор: Partizan 1.1.2006, 21:39 |
| Ну хорошо...назовём это "буквальной" копией объекта... Возможно я не слишком красиво ывразился, однако, думаю и вы, и, надеюсь, автор этой темы поняли о чём шла речь. Имелось ввиду, что объекты побитово идентичны... |
| Автор: blackofe 4.1.2006, 00:18 | ||
в том-то и дело, что нет. объекты будут побитово идентичны только в том случае, если у класса нет ни членов с определенными конструкторами, ни соответствующих базовых классов. так что в общем случае данное утверждение несправедливо, о чем и пытался сказать Daevaorn. |
| Автор: Partizan 4.1.2006, 00:32 | ||||
|
| Автор: blackofe 4.1.2006, 00:45 | ||||
сначала выдержка из msdn: A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed. а вот пример:
результат работы: A(N), an: 10 copy A(), an: 20 10 20 ~A(), an: 20 ~A(), an: 10 Press any key to continue если бы копирование было побитовое, то мы бы получили 10 10 но конструктор копии по умолчанию класса B (мы для него конструктор копии явно не описывали) вызвал конструктор копии класса A, тем самым увеличив значение an в два раза. |
| Автор: Partizan 4.1.2006, 00:58 | ||||
| в том то и дело, что мы переопределили конструктор копирования....в том же посте речь шла о конструкторе копирования ПО УМОЛЧАНИЮ Читаем внимательно:
то бишь если видоизменить ваш пример следующим образом:
то мы получаем: A(N), an: 10 10 10 ~A(), an: 10 ~A(), an: 10 Press any key to continue З.ы. ребят...читайте, пожалуйста, посты внимательнее... |
| Автор: blackofe 4.1.2006, 01:06 | ||
| Partizan тебе тоже не мешало бы читать посты внимательнее. вот этот код
вызывает конструктор копии класса B. мы для этого класса (class B) конструктор копии сами не создавали, уповая на конструктор копии, который создаст компилятор по умолчанию. он создал. но не побитовый, как бы ты хотел, а с вызовом соответствующих конструкторов для членов и для базовых классов. что мы и наблюдаем: конструктор копии по-умолчанию класса B не выполнил побитовое копирование объекта b1, а вызвал конструктор копии члена - объекта типа A. (для него мы написали конструктор копии, чтобы ты мог убедиться: да, конструктор копии по-умолчанию вызывает конструкторы членов и базовых классов, а не выполняет простое побитовое копирование). |
| Автор: Partizan 4.1.2006, 01:34 |
| Всё, спасибо...признаю...был неправ в той части, где говорил о побитовом копировании... Но утверждение полностью верно в случае отсутствия каких бы то ни было конструкторов... З.ы. поставил бы вам + за такой ценный урок....но не могу...постов не хватает... |
| Автор: blackofe 4.1.2006, 01:35 |
| Partizan, свои люди - сочтемся Добавлено @ 01:42 кстати, такое поведение конструктора копии по-умолчанию весьма ценно. во всяком случае, мы можем быть уверены, что если кто-то воспользуется нашим классом путем агрегирования или наследования, то, даже если он не определит конструктор копирования, компилятор это сделает за него и правильно вызовет наши конструкторы. единственно, мы не застрахованы от того, что пользователь наших классов не напишет конструкторы копирования неправильно. ну, тут уж.. ;) |