Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

 p2-›i = 3; // недопустимо

}

R.11.6 Доступ к виртуальным функциям

Правила доступа (§R.11) к виртуальной функции определяются ее описанием и на них не влияют правила доступа к к функции, которая позднее будет подавлять ее. Приведем пример:

class B {

public:

 virtual f;

};

class D: public B {

private:

 f;

};

void f

{

 D d;

 B* pb = &d;

 D* pd = &d;

 pb-›f; //
нормально: B::f общий член

// вызывается D::f

 pd-›f; // ошибка: D::f частный член

}

Права доступа проверяются при самом вызове, используя тип выражения, обозначающее объект, для которого вызывается функция-член (в примере выше это B*). Доступ к функции-члену в классе, где она определена (D в примере выше), в общем случае неизвестен.

R.11.7 Множественный доступ

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

class W { public: void f; };

class A: private virtual W {};

class B: public virtual W {};

class C: public A, public B {

 void f { W::f; } // нормально

};

Поскольку W::f доступно в C::f по пути, связанному с общим наследованием из B, обращение является законным.

R.12 Специальные функции-члены

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

Эти функции-члены подчиняются обычным правилам доступа (§R.11). Например, описание конструктора со спецификацией protected гарантирует, что создавать объекты с его помощью смогут только производные классы и друзья.

R.12.1 Конструкторы

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

Конструктор может вызываться для объекта со спецификацией const или volatile. Сам конструктор нельзя описывать со спецификацией const или volatile (§R.9.3.1). Конструктор также не может иметь спецификацию virtual или static.

Конструкторы не наследуются, однако, стандартные конструкторы и конструкторы копирования при необходимости создаются транслятором (§R.12.8). Такие конструкторы являются общими.

Стандартным конструктором для класса X является такой конструктор класса X, который можно вызывать без параметров. Стандартный конструктор для класса X будет создан только тогда, когда для класса X не описано ни одного конструктора.

Конструктором копирования для класса X называется конструктор, который вызывается для

копирования объекта класса X, т.е. вызывается с одним параметром типа X. Например, X::X(const X&) и X::X(X&, int=0) являются конструкторами копирования. Конструктор копирования создается только тогда, когда не описано ни одного конструктора копирования.

Конструктор копирования для класса X не должен иметь в качестве параметра объект типа X, например X::X(X) незаконное обращение.

Конструктор для массива элементов вызывается в порядке возрастания адресов элементов (§R.8.2.4).

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

Объект класса с конструктором не может быть членом объединения.

Для конструктора не нужно указывать никакого типа возвращаемого значения, даже void. В операторе return в теле конструктора нельзя указывать возвращаемое значение. Не допустима операция взятия адреса конструктора.

Конструктор можно явно использовать для создания объектов его типа с помощью следующей записи:

имя-класса ( список-выражений opt )

Приведем пример:

complex zz = complex(1,2.3);

print(complex(7.8,1.2));

Объект, созданный таким образом является безымянным (если только конструктор не использовался для инициализации поименованной переменной как zz выше), а время его жизни ограничено выражением, в котором он был создан, см. §R.12.2.

В конструкторе можно вызывать функцию-член, см. §R.12.7.

R.12.2 Временные объекты

В некоторых ситуациях транслятору бывает необходимо или удобно создавать временные объекты. Использование временных объектов зависит от реализации. Если транслятору понадобился временный объект типа класса с конструктором, он должен обеспечить вызов конструктора для этого временного объекта. Аналогично, необходимо вызывать деструктор для объекта класса, в котором описан деструктор. Приведем пример:

class X {

 //…

public:

 //…

 X(int);

 X(X&);

 ~X;

};

X f(X);

void g

{

 X a(1);

 X b = f(X(2));

 a = f(b);

}

Здесь нужен временный объект для построения X(2), прежде чем передать его функции f с помощью X(X&). Альтернативное решение, - построить объект X(2) в памяти, используемой для хранения параметра при первом вызове f. Помимо этого, временный объект может понадобиться для хранения результата f(X(2)) прежде, чем копировать его в объект b с помощью X(X&), и здесь возможно альтернативное решение: хранить результат f(X(2)) в памяти для объекта b. С другой стороны, существует много функций f, для которых выполнение выражения a=f(a) требует временного объекта или для параметра a, или для результата f(a), чтобы избежать нежелательного использования памяти, которой приписывается имя a.

Поделиться:
Популярные книги

Страж Кодекса. Книга IV

Романов Илья Николаевич
4. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга IV

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Я тебя не отпускал

Рам Янка
2. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.55
рейтинг книги
Я тебя не отпускал

Пятнадцать ножевых 3

Вязовский Алексей
3. 15 ножевых
Фантастика:
попаданцы
альтернативная история
7.71
рейтинг книги
Пятнадцать ножевых 3

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Боги, пиво и дурак. Том 4

Горина Юлия Николаевна
4. Боги, пиво и дурак
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 4

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Комендант некромантской общаги 2

Леденцовская Анна
2. Мир
Фантастика:
юмористическая фантастика
7.77
рейтинг книги
Комендант некромантской общаги 2

Младший сын князя. Том 2

Ткачев Андрей Юрьевич
2. Аналитик
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Младший сын князя. Том 2

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3