R.12.6.2 Инициализация членов и базовых классов
R.12.6.2 Инициализация членов и базовых классов
В определении конструктора можно задать инициализацию прямых базовых классов и членов, не наследуемых из базовых классов. Это особенно полезно для тех объектов, констант и ссылок, для которых различаются семантики присваивания и инициализации. Конструкция инициализатор-ctor имеет вид
инициализатор-ctor:
: список-инициализаторов-членов
список-инициализаторов-членов:
инициализатор-члена
инициализатор-члена , список-инициализаторов-члена
инициализатор-члена:
полное-имя-класса ( список-выражений opt )
идентификатор
Список параметров используется для инициализации нестатических членов или объектов базового класса. Это единственный способ инициализации нестатических членов, являющихся ссылками или объектами типа const, например:
struct B1 { B1(int); /*… */ };
struct B2 { B2(int); /*… */ };
struct D: B1, B2 {
D(int);
B1 b;
const c;
};
D::D(int a): B2(a+1), B1(a+2), c(a+3), b(a+4)
{/*… */}
D d(10);
В начале инициализируются базовые классы в порядке их описания (независимо от порядка инициализаторов-членов), затем по той же схеме инициализируются члены, и наконец выполняется тело D::D() (§R.12.1). Порядок описания выдерживается для того, чтобы гарантировать, что вложенные объекты и члены будут уничтожаться в порядке, обратном их инициализации.
Особый случай представляют виртуальные базовые классы. Они создаются прежде, чем любой невиртуальный базовый класс и в том же порядке, в каком появляются при обходе снизу и слева-направо ацикличного направленного графа базовых классов. Порядок "слева-направо" - это тот, в котором имена базовых классов задаются при описании в производном классе.
Полным называется объект, который не является вложенным объектом, представляющим некоторый базовый класс. Класс такого объекта называют наибольшим производным классом объекта. Все вложенные объекты виртуальных базовых классов инициализируются с помощью конструктора наибольшего производного класса. Если в конструкторе наибольшего производного класса не задан инициализатор-члена для виртуального базового класса, тогда этот виртуальный базовый класс должен иметь стандартный конструктор,либо не иметь никакого конструктора. Всякий инициализатор-члена для виртуального базового класса, заданный не в конструкторе класса полного объекта, игнорируется. Приведем пример:
class V {
public:
V();
V(int);
//…
};
class A: public virtual V {
public:
A();
A(int);
//…
};
class B: public virtual V {
public:
B();
B(int);
//…
};
class C: public A, public B, private virtual V {
public:
C();
C(int);
//…
};
A::A(int i): V(i) {/*… */}
B::B(int i) {/*… */}
C::C(int i) {/*… */}
V v(1); // use V(int)
A a(2); // use V(int)
B b(3); // use V()
C c(4); // use V()
Инициализатор-члена вычисляется в области видимости конструктора, в котором он появился. Например, в следующем фрагменте
class X {
int a;
public:
const int& r;
X()::r(a) {}
};
X::r инициализируется для каждого объекта класса X ссылкой на X::a.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Пример: использование базовых указателей
Пример: использование базовых указателей Рассмотренные выше примеры относились к сортировке файлов в различных ситуациях. Вместе с тем, должно быть очевидным, что наша цель состояла не в обсуждении методик сортировки, а в демонстрации применения различных методов
50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными
50. Делайте деструкторы базовых классов открытыми и виртуальными либо защищенными и невиртуальными РезюмеУдалять или не удалять — вот в чем вопрос! Если следует обеспечить возможность удаления посредством указателя на базовый класс, то деструктор базового класса
Глава 9 Среда разработки: библиотека базовых классов
Глава 9 Среда разработки: библиотека базовых классов Основным преимуществом объектно-ориентированных языков программирования, таких, как C++ и Smalltalk, является высокая степень повторного использования в хорошо спроектированных системах. Это означает, что для разработки
Роль библиотек базовых классов
Роль библиотек базовых классов В дополнение к спецификациям CLR и CTS/CLS, платформа .NET предлагает библиотеку базовых классов, доступную всем языкам программирования .NET. Эта библиотека базовых классов не только инкапсулирует различные примитивы, такие как потоки, файловый
Управление созданием базовых классов с помощью base
Управление созданием базовых классов с помощью base В настоящий момент SalesPerson и Manager можно создать только с помощью конструктора, заданного по умолчанию. Поэтому предположим, что в тип Manager добавлен новый конструктор с шестью аргументами, который вызывается так, как
Интерфейсы с множеством базовых интерфейсов
Интерфейсы с множеством базовых интерфейсов При построении иерархии интерфейсов вполне допустимо создавать интерфейсы, которые оказываются производными от нескольких базовых интерфейсов. Однако напомним, что нельзя строить классы, которые будут производными от
Создание обобщенных базовых классов
Создание обобщенных базовых классов Перед рассмотрением обобщенных интерфейсов следует указать на то, что обобщенные классы могут быть базовыми для других классов и могут таким образом определять любое число виртуальных и абстрактных методов. Однако производные типы
Соответствие между типами библиотеки базовых классов .NET, C# и CIL
Соответствие между типами библиотеки базовых классов .NET, C# и CIL В табл. 15.4 показано соответствие между типами базовых классов .NET и ключевыми словами C#, а также между ключевыми словами C# и командами CIL. Там же представлены сокращенные обозначения констант, используемые для
Лекция № 8. Создание базовых отношений
Лекция № 8. Создание базовых отношений Предметом этой лекции будет довольно подробное рассмотрение оператора создания базового отношения. Мы подвергнуть разбору сам оператор в записи на псевдокоде, проанализируем все его составляющие и их работу, разберем способы
6. Модификация базовых отношений
6. Модификация базовых отношений Для успешной и продуктивной работы с различными базовыми отношениями очень часто разработчикам необходимо каким-либо образом модифицировать это базовые отношения.Какие основные необходимые варианты модификации встречаются чаще всего
Пример. Простановка базовых размеров
Пример. Простановка базовых размеров Проставьте линейный размер, а затем от него – базовые (рис. 10.15). Рис. 10.15. Простановка базовых размеровЗапустите команду DIMLINEAR, вызвав ее из меню Dimension ? Linear или щелчком на пиктограмме Linear на панели инструментов Dimension. Ответьте на
Еще раз о базовых классах
Еще раз о базовых классах С введением закрепленных типов нуждается в расширении понятие базового класса типа.Сначала классы и типы были для нас едины, и это их свойство - отправной пункт ОО-метода, - по существу, сохраняется, хотя нам пришлось немного расширить систему
Константы базовых типов
Константы базовых типов Глобальные объекты - некий вызов ОО-методу, провозглашающему идеи децентрализации, модульности и автономности. Борьба шла за независимость модулей, за избавление от произвола центральной власти. Теперь этой власти нет. Как же построить систему, в