crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в преобразование типа и классы
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 6.4.2010, 10:02
  Не совсем так. Дефолтный конструктор, конструктор копирования, оператор = и деструктор относятся к специальным член-функциям.
Дефолтный конструктор генерируется компилятором автоматически, если не указан явно ни один пользовательский конструктор. Как правило, такой дефолтный конструктор пустой и успешно оптимизируется компилятором. Однако, для всех баз и членов вызываются их дефолтные конструкторы, если таковые существуют, иначе генерируется ошибка компиляции. Для баз - в порядке их объявления в списке наследования, для членов - в порядке их объявления.
Конструктор копирования не наследуется. Если не указан явно пользовательский конструктор копирования, то генерируется дефолтный конструктор копирования, который тупо почленно копирует все базы и члены класса. Порядок копирования тот же.
То же самое верно и для оператора =. Если не указан явно пользовательский оператор назначения (присваивания), то генерируется дефолтный оператор =, который тупо вызывает операторы = для всех баз и членов. Порядок тот же.
Тот же самый принцип действует и для деструкторов, с одним отличием: деструкторы всегда вызываются в порядке, обратном вызовам конструкторов.
kwisp Дата 6.4.2010, 8:55
 
Цитата(ViGOur @ 5.4.2010, 22:54) *
Ну вообще-то это кажется по стандарту. :)

в том то и дело как я понял. если ты не пишешь ничего руками ни конструктор копий ни конструктор по умолчанию, то это за тебя сделает компилятор, однако если ты хотя бы в одном классе родительском переопределишь конструтор копий -- компилятор умывает руки, дальше делай всё сам.
я так понимаю.
ViGOur Дата 5.4.2010, 21:54
 
Цитата(Iron Bug @ 5.4.2010, 22:05) *
у мелкософта, к примеру, он сам генерит пустые конструкторы и конструкторы копий по умолчанию.
Ну вообще-то это кажется по стандарту. :)
Iron Bug Дата 5.4.2010, 21:05
  да, я тоже стараюсь избегать неявного преобразования типов.
к тому же, тут компилятор иногда может оказать "медвежью услугу": у мелкософта, к примеру, он сам генерит пустые конструкторы и конструкторы копий по умолчанию. а это, на самом деле, потенциальная дыра. я уже один раз напарывалась на это. уж если нужно преобразование, то его нужно указывать явно. а если оно ещё и сложное - то самому прописывать это преобразование, не надеясь на то, что может придумать компилятор.
AD Дата 5.4.2010, 17:11
  Да все очень просто. Лучше не делать таких вот операторов из-за неявного преобразования типов. о вреде неявного преобразования написано очень много. Думаю, сможешь найти! :)
ViGOur Дата 5.4.2010, 16:55
  Ну почему же!
Что не правильно в том, что оператор присваивания класса Integer будет принимать в качестве параметра int?

Добавлено:

Или если взять пример:

class Животное{...};
class Лошадь: public Животное{...};

Почему не правильно: Лошадь::operator=( Животное&) ?
Лошадь это же животное и почему ей нельзя присвоить все свойства присущие животному, того или иного возраста или пола?

з.ы. я знаю, что это не правильно.
Просто хочу услышать почему, так как уже не помню почему! :lol:
Влад Дата 5.4.2010, 16:36
  Вообще-то, "по правильному" и operator=, и конструктор копирования должны принимать в качестве аргумента (константную ссылку на) объект своего же класса. Все преобразования должны осуществляться явно соответствующими операторами, причем, если это конструкторы - то стоит объявить их explicit во избежание выполнения не предусмотренных программистом преобразований.
ViGOur Дата 5.4.2010, 9:32
  Как вариант можно и оператор присваивания: SLAU &operator=(const CTable&){}.
kwisp Дата 5.4.2010, 9:26
  ViGOur,
давайте обсудим эту тему.
по-моему конструктор копий понадобился если бы было так:
CMatrix A;
SLAU B=A;


а у него:
CMatrix A;
SLAU B;
B=A;


по-моему оператор = принимающий CMatrix нужен.
он же переопределил оператор = в родительском классе теперь , это на его совести.

или я ошибаюсь? поправьте.

ViGOur Дата 5.4.2010, 8:58
  voipp, добавь в класс SLAU конструктор копий такого вида: SLAU(const CTable&){} и все будет компилиться!
И подумай, почему он нужен! ;)
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 12.7.2025, 0:27