Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Указатели и ссылки на объекты



Доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае обычно применяется операция « -> ». Указатель на объект объявляется точно так же, как и указатель на переменную любого типа. Для получения адреса объекта перед ним необходим оператор « & ».

main()

{

_3d A (2, 3, 4);

_3d *pA;

pA = & A;

double dM = pA-> mod();

}

 

В C++ есть элемент, родственный указателю, - это ссылка. Ссылка является скрытым указателем и всегда работает в качестве другого (дополнительного) имени переменной.

Наиболее важное использование ссылки - передача ее в качестве параметра. Чтобы разобраться в том, как работает ссылка, рассмотрим для начала программу, использующую в качестве параметра указатель.

void ToZero(_3d *vec)

{

vec-> set(0, 0, 0); // используется " -> "

}

main()

{

_3d A(2, 3, 4);

ToZero(& A);

}

 

В C++ можно сделать то же самое без использования указателя с помощью параметра-ссылки.

void ToZero(_3d & vec)

{

vec.set(0, 0, 0); // используется "."

}

main()

{

_3d A(2, 3, 4);

ToZero(A);

}

 

При применении параметра-ссылки компилятор передает адрес переменной, используемой в качестве аргумента. При этом не только не нужно, но и неверно использовать оператор « *». Внутри функции компилятор использует переменную, на которую ссылается параметр-ссылка.

В отличие от передачи параметра по значению, использование ссылки предполагает, что функция, в которую передан данный параметр, будет манипулировать не копией передаваемого объекта, а непосредственно самим передаваемым объектом.

Параметры-ссылки имеют некоторые преимущества по сравнению с аналогичными альтернативными параметрами-указателями. Во-первых, нет необходимости получать и передавать в функцию адрес аргумента, адрес передается автоматически. Во-вторых, ссылки предлагают более понятный и элегантный интерфейс, чем неуклюжий механизм указателей.

Ссылки могут также использоваться в качестве возвращаемого значения функции. Обычно такой механизм применяется в сочетании со ссылкой-параметром или указателем this. Все эти случаи объединяет необходимость передачи измененного объекта через его адрес, а не путем возвращения копии такого объекта. Вспомним хотя бы пример с переопределением оператора «=», где в качестве возвращаемого значения выступала копия измененного оператором «=» объекта. Теперь мы знаем, что можно сделать проще и эффективнее, если возвращать ссылку на измененный объект.

_3d& _3d:: operator = (_3d& b)

{

x = b.x;

y = b.y;

z = b.z;

return *this;

}

 

Использование в качестве возвращаемого значения ссылку гарантирует, что возвращаемым в качестве результата этой функции будет именно тот объект, который вызывал операцию «=», а не его копия.

3. Наследование на языке С++

Модификаторы наследования

Когда один класс наследуется другим, класс, который наследуется, называется базовым классом. Наследующий класс называют производным классом. Новый класс строится на базе уже существующего с помощью конструкции следующего вида.

class Parent {....};

class Child: [модификатор наследования] Parent {....};

 

Модификатор наследования определяет видимость наследуемых переменных и методов для пользователей и возможных потомков самого класса-потомка. Другими словами, он определяет, какие права доступа к переменным и методам класса-родителя будут переданы классу-потомку. При реализации наследования область видимости принадлежащих классу данных и методов можно определять выбором ключевого слова private (собственный), public (общедоступный) или protected (защищенный), которые могут произвольно чередоваться внутри описания класса.

private описывает закрытые члены класса, доступ к которым имеют только методы-члены этого класса, public предназначен для описания общедоступных элементов, доступ к которым возможен из любого места в программе. Особый интерес представляют элементы, обладающие модификатором доступа protected.

Модификатор protected используется тогда, когда необходимо, чтобы некоторые члены базового класса оставались закрытыми, но были бы доступны для производного класса. Модификатор protected эквивалентен private с единственным исключением: защищенные члены базового класса доступны для членов всех производных классов этого базового класса.

То, как изменяется доступ к элементам базового класса из методов производного класса в зависим ости от значения модификаторов наследования, можно видеть в следующей таблице.

Конструкторы при наследовании

Базовый класс, производный класс или и тот, и другой могут иметь конструкторы и/или деструкторы. Если и у базового, и у производного классов есть конструкторы и деструкторы, то конструкторы выполняются в порядке наследования, а деструкторы - в обратном порядке. То есть если А - базовый класс, В - производный из А, а С - производный из В (А-В-С ), то при создании объекта класса С вызов конструкторов будет иметь следующий порядок: конструктор А - конструктор В - конструктор С. Вызов деструкторов при разрушении этого объекта произойдет в обратном порядке: деструктор С - деструктор В - деструктор А.

Понять закономерность такого порядка несложно, поскольку базовый класс «не знает» о существовании производного класса, любая инициализация выполняется в нем независимо от производного класса, и, возможно, становится основой для инициализации, выполняемой в производном классе. С другой стороны, поскольку базовый класс лежит в основе производного, вызов деструктора базового класса раньше деструктора производного класса привел бы к преждевременному разрушению производного класса.

Конструкторы могут иметь параметры. При реализации наследования допускается передача параметров для конструкторов производного и базового класса. Если параметрами обладает только конструктор производного класса, то аргументы передаются обычным способом.

Однако при необходимости передать аргумент конструктору родительского класса требуется несколько большее усилие. Прежде всего, нужно позаботиться о том, чтобы передать параметры из конструктора производного класса конструктору базового класса. Для этого используется расширенная запись конструктора производного класса.

конструктор_производного_класса (список формальных параметров):

конструктор_базового_класса (список фактических параметров)

{

... // тело конструктора производного класса

}

Для базового и производного классов допустимо использование одних и тех же параметров. Не исключено, что списки параметров конструкторов производного и базового классов будут различны. Кроме того, конструктору производного класса нет необходимости использовать все аргументы, полученные для передачи в базовый класс, т.е. конструктор производного класса может принять некоторые аргументы только для того, чтобы просто передать их конструктору базового класса, а сам может их никак не использовать.

class BaseClass

{

int i;

public:

BaseClass(int ii)

{i=ii; }

~BaseClass()

{cout < < ' Работа деструктора базового класса \n'; }

};

class DerivedClass: public BaseClass

{

int n;

public:

DerivedClass(int nn, int m): BaseClass (m)

{n=nn; }

~DerivedClass()

{cout < < ' Работа деструктора производного класса \n'; }

};

main()

{

DerivedClass obj(2, 3);

}

 

Допускается также, что конструктор базового класса может иметь больше параметров, чем конструктор производного класса.

class BaseClass

{

int j, i;

public:

BaseClass(int jj, int ii)

{j=jj; i=ii; }

~BaseClass()

{cout < < 'Работа деструктора базового класса \n'; }

};

class DerivedClass: public BaseClass

{

int n;

public:

DerivedClass(int nn);

~DerivedClass()

{cout < < ' Работа деструктора производного класса \n'; }

};

DerivedClass:: DerivedClass(int nn): BaseClass(nn/2, nn%2)

{n=nn; }

main()

{

DerivedClass obj(15);

}

 

Еще раз обратим внимание на то, что в расширенной форме объявления конструктора производного класса описывается вызов конструктора базового класса.


Поделиться:



Популярное:

  1. V1: Объекты, субъекты товароведения
  2. АМОРТИЗАЦИЯ И ОБЪЕКТЫ НАЧИСЛЕНИЯ АМОРТИЗАЦИИ ОФ И НЕМАТЕРИАЛЬНЫХ АКТИВОВ
  3. Библиографические ссылки, включенные в комплексную ссылку, отделяют друг от друга точкой с запятой с пробелами до и после этого предписанного знака.
  4. Билет №4.Классы и объекты, Члены классов. Статические члены классов.
  5. Виды и объекты криминалистической идентификации
  6. ВК РФ, Статья 5. Поверхностные водные объекты и подземные водные объекты
  7. ВК РФ, Статья 66. Особо охраняемые водные объекты
  8. Влияние загрязнителей на биологические объекты
  9. Вспомогательные указатели (если есть и это необходимо)
  10. Дизайн и культура общества. Объекты дизайна. Дизайн как категория эстетической деятельности и художественная коммуникация. Профессия дизайнер.
  11. Заимствования текста без ссылки на них (плагиат) не допускаются.
  12. Институт сертификации: объекты сертификации, формы подтверждения соответствия.


Последнее изменение этой страницы: 2016-07-14; Просмотров: 830; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.024 с.)
Главная | Случайная страница | Обратная связь