|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Стандартные конструкторы
Если программист не определяет в классе конструкторы, то компилятор создает автоматически два конструктора: конструктор без параметров конструктор копирования
class TTextReader { public: TTextReader(); // конструктор без параметров TTextReader(const TTextReader &R); // конструктор копирования }
Если программист определил хотя бы один конструктор в класс – компилятор не создаст никаких стандартных конструкторов.
Конструктор без параметров создается для того, чтобы можно было написать: TTextReader R;
Конструктор копирования нужен для следующей записи: TTextReader R1 = R2; // означает TTextReader.R1(R2);
Конструктор копирования вызывается в том случае, когда создаваемый по значению объект создается путем копирования другого уже существующего объекта. Следует отметить, что запись: TTextReader R1 = R2;
и два оператора: TTextReader R1; R1 = R2;
имеют схожий синтаксис с вызовом конструктора копирования, но разную семантику: в первом случае объект создается конструктором копирования, во втором – конструктором без параметров, а затем с помощью оператора‘=’ выполняется присваивание одного объекта другому (данный вариант требует перегрузки оператора‘=’ для класса TTextReader).
Работа стандартного конструктора копирования, создаваемого компилятором, заключается в том, чтобы выполнить полное копирование памяти с помощью функции memcpy.
Вы можете использовать конструктор более чем только для инициализации нового объекта. Например, наша программа содержит такой оператор в функции main():
stockl = Stock (" Nifty Foods ", 10, 50.0);
Объект stockl уже существует. Поэтому вместо инициализации stockl данный оператор присваивает ему новые значения. Это делается за счет создания конструктором нового временного объекта и последующего копирования его содержимого в stockl. Затем программа уничтожает временный объект, вызывая его деструктор. Некоторые компиляторы могут удалять временный объект позже, откладывая вызов деструктора.
Объекты с автоматическим хранением удаляются в порядке, обратном тому, в котором они создавались.
Предположим, что вы создали нечто наподобие:
class Dwelling { public: virtual void showperks (int а) const; }; class Hovel: publiv Dwelling { public: virtual void showperks () const; };
Hovel trurnp; trurnp.showperks(); // верно trurnp.s howperks(S); // неверно
Если вы переопределяете унаследованный метод, необходимо убедиться в точном совпадении с исходным прототипом. Одно сравнительно новое исключение из этого правила состоит в том, что возвращаемый тип (указатель или ссылка на базовый класс) может быть заменен указателем или ссылкой на производный класс. Это свойство называеется изменчивостъю возвращаемого типа, поскольку возвращаемый тип допускается изменять параллельно с типом класса.
Если объявление класса перегружается, вам необходимо переопределить все версии базового класса в производном классе. Если вы переопределяете только одну версию, то остальные становятся скрытыми и не могут использоваться объектами производного класса. Если не нужны никакие изменения, то переопределение может просто вызывать версию базового класса.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |