Читаем Справочное руководство по C++ полностью

Статическая функция-член не имеет указатель this, поэтому для доступа к нестатическим членам своего класса она должна использовать операции . или -›. Статическая функция-член не может быть виртуальной. Недопустимы статические и нестатические функции-члены с одним именем и одинаковыми типами параметров.

Статические члены локального класса (§R.9.8) не подлежат связыванию и не могут определяться вне описания класса. Отсюда следует, что локальные классы не могут иметь статических членов, представляющих данные.

К статическому члену mem класса c1 можно обращаться как c1::mem (§R.5.1), т.е. независимо ни от какого объекта. К нему также можно обращаться с помощью операций доступа к членам . и -›. Если к статическому члену происходит обращение с помощью операций доступа, выражения, стоящие слева от . или -› не эквивалентны. Статический член mem существует даже, если не создано ни одного объекта класса c1. В примере ниже run_chain, idle и другие члены существуют даже, если не было создано ни одного объекта класса process:

class process {

 static int no_of_process;

 static process* run_chain;

 static process* running;

 static process* idle;

 //…

public:

 //…

 int state();

 static void reshedule();

 //…

};

Здесь к функции reshedule можно обратиться без указания объекта класса process таким образом:

void f()

{

 process::reshedule();

}

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

void process::reshedule() {/*… */};

int process::no_of_process = 1;

process* process::running = get_main();

process* process::run_chain = process::running;

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

В типе статического члена не участвует имя класса, так тип process::no_of_process есть int, а тип &process::reshedule() - void(*)().

<p>R.9.5 Объединения</p></span><span>

Объединение можно представить как структуру, все члены имеют нулевое смещения, а размер ее достаточно велик, чтобы вмещать любой из ее членов. В любой момент времени объединение может содержать только один член. В объединении могут быть функции-члены (в том числе конструкторы и деструкторы), но не виртуальные функции (§R.10.2). Объединение не может иметь базовых классов и не может само использоваться в качестве базового класса. Членом объединения не может быть объект класса с конструктором или деструктором, а также с определенной пользователем операцией присваивания (§R.13.4.3). Объединение не может содержать статических членов, представляющих данные.

Объединение вида

union { список-членов }

называется безымянным объединением, оно определяет объект без имени (и без типа). Имена всех членов безымянного объединения должны отличаться от других имен в той области видимости, в которой описано объединение; их можно использовать в этой области видимости непосредственно, без обычных операций доступа к членам (§R.5.2.4).

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

void f()

{

 union { int a; char* p; };

 a = 1;

 //…

 p = "Jennifer";

 //…

}

Здесь a и p используются как обычные переменные (не члены), но поскольку они входят в одно объединение, их адреса совпадают.

Глобальные безымянные объединения можно описать со спецификацией static. Безымянные объединения не должны содержать частных или защищенных членов (§R.11), а также функций-членов.

Если описаны объекты объединения или указатели на него, то оно не считается безымянным, например,

union { int aa; char* p; } obj, *ptr= &obj

aa = 1; // ошибка

ptr-›aa = 1; // нормально

Здесь присваивание простому имени aa незаконно, т.к. имя члена не привязано ни к какому объекту.

Инициализация объединений, не имеющих конструкторов, описывается в §R.8.4.1.

<p>R.9.6 Битовые поля</p></span><span>

Конструкция описатель-члена, имеющая вид,

идентификатор opt : выражение-константа

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

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Данная книга посвящена программированию игр с помощью ActionScript. Здесь вы найдете подробные указания, необходимые для создания самых разных игр – аркад, головоломок, загадок и даже игровых автоматов. В тексте приведены исходные коды программ и детальные, доступно изложенные инструкции. Базовые принципы программирования ActionScript рассматриваются на примере игр, однако вы без труда сможете применить полученные знания и для разработки неигровых проектов, таких как Web-дизайн и реклама. Рекомендации Гэри Розенцвейга помогут вам не только придумывать занимательные игры и размещать их на Web-сайте, но и оптимизировать скорость их работы, а также защищать свои творения от несанкционированного копирования. Представленный в книге код несложно изменить для использования в других программах.Книга предназначена для широкого круга читателей – создателей анимационных роликов, художников-оформителей, программистов и разработчиков Web-сайтов. Издание может также выступать в качестве практического пособия по изучению ActionScript.

Гэри Розенцвейг

Программирование, программы, базы данных / Программирование / Книги по IT