АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Стандартные конструкторы

Читайте также:
  1. Как создавать стандартные документы
  2. КЛАССЫ. КОНСТРУКТОРЫ
  3. Конструкторы и деструкторы
  4. Налоговый период по НДФЛ, налоговые вычеты по НДФЛ (стандартные, социальные, имущественные и профессиональные).
  5. СТАНДАРТНЫЕ ВЫЧЕТЫ
  6. Стандартные вычеты.
  7. Стандартные вычеты.
  8. Стандартные и нормативные ссылки
  9. Стандартные мотивы.
  10. Стандартные налоговые вычеты
  11. Стандартные налоговые вычеты

 

Если программист не определяет в классе конструкторы, то компилятор создает автоматически два конструктора:

ƒ конструктор без параметров

ƒ конструктор копирования

 

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); // неверно

 

Если вы переопределяете унаследованный метод, необходимо убедиться в точном совпадении

с исходным прототипом. Одно сравнительно новое исключение из этого правила состоит в том, что возвращаемый тип (указатель или ссылка на базовый класс) может быть заменен указателем или ссылкой на производный класс. Это свойство называеется изменчивостъю возвращаемого типа, поскольку возвращаемый тип допускается изменять параллельно с типом класса.

 

Если объявление класса перегружается, вам необходимо переопределить все версии базового класса в производном классе. Если вы переопределяете только одну версию, то остальные становятся скрытыми и не могут использоваться объектами производного класса. Если не нужны никакие изменения, то переопределение может просто вызывать версию базового класса.

 


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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)