Читайте также:
|
|
Если программист не определяет в классе конструкторы, то компилятор создает автоматически два конструктора:
конструктор без параметров
конструктор копирования
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); // неверно
Если вы переопределяете унаследованный метод, необходимо убедиться в точном совпадении
с исходным прототипом. Одно сравнительно новое исключение из этого правила состоит в том, что возвращаемый тип (указатель или ссылка на базовый класс) может быть заменен указателем или ссылкой на производный класс. Это свойство называеется изменчивостъю возвращаемого типа, поскольку возвращаемый тип допускается изменять параллельно с типом класса.
Если объявление класса перегружается, вам необходимо переопределить все версии базового класса в производном классе. Если вы переопределяете только одну версию, то остальные становятся скрытыми и не могут использоваться объектами производного класса. Если не нужны никакие изменения, то переопределение может просто вызывать версию базового класса.
Дата добавления: 2015-11-16; просмотров: 64 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Понятие пространства имен | | | Порядок конструирования и разрушения объектов |