Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11271 / 455 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 10:

С++. Классы. Механизмы наследования. Объектные типы

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >

Вложенные классы

Язык С++ допускает использование вложенных классов - внутри тела одного класса содержится объявление других классов.

Например:

class A
{
public:
	A(void);
	~A(void);
	class B {	// Вложенный класс
		 B(void) {};  
		 ~B(void) {};
char sStr2[3]; 
		};

};

Объектные типы

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

При объявлении переменной объектного типа (типа класса) создаются переменные члены класса и вызывается конструктор класса. Производные типы на основе классов позволяют получать доступ к членам класса.

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

Hапример:

#include <iostream.h>
class A		// Объявление класса A
{ public: int j1;
	A(void);
	~A(void);};
void main() { 
int A::*pToj = &A::j1; 
    // Объявление производного типа pToj
    // как указателя на член класса j1 
A jA;           		
    // Объявление переменной объектного типа A
A *pjA = & jA;   
    // Объявление указателя на эту 
    // переменную (объект)
int j;
jA.*pToj = 123;    
    // Присваивание значения переменной 
    // jA::j1, используя * 
j = pjA ->*pToj; 
    // Получение значения, используя ->*
 std::cout << j << "\n";
}

Преобразование объектных типов

Указатель на класс может быть преобразован к указателю на базовый класс в двух случаях:

  • если базовый класс является доступным и преобразование однозначно;
  • если указано явное преобразование типа указателя.

Например:

class A		   // А - базовый класс
{public:
    int a1;
    int Fa();
};
class B : public A	// В - производный класс
{public:
    int b1;
    int Fb();
};
B bObj;		// Объект типа B
A *pA = &bObj;	
    // Преобразование типа ограничивает 
	// доступ к членам класса B и 
	// разрешает доступ только к членам 
	// базового класса
B *pB = &bObj;	
    // Нет преобразования типа и 
	// следовательно разрешен доступ как 
	// к членам класса B, 
	// так и к членам класса А.
pA-> Fa ();  	
    // Правильно: вызов функции члена класса A.
pB-> Fa ();  	
    // Правильно: вызов функции, 
	//наследуемой от класса A
// Вызов pA-> Fb ();   ошибочен: функция Fb
// недоступна через указатель на базовый 
// класс А

Указатели на члены класса или структуры не могут рассматриваться как обычные указатели и для них не выполняется стандартное преобразование типа.

Квалификация имен

Квалификация имен используется для однозначного понимания указываемого имени.

Для квалификации имени могут использоваться следующие операторы: :: (оператор принадлежности); . (оператор доступа к члену класса посредством имени); -> (оператор доступа к члену класса через указатель).

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

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

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);