Программирование >>  Программирование на языке c++ 

1 ... 34 35 36 [ 37 ] 38 39 40 ... 159


тем же именем f, то, в отличие от нашей функции f, глобальная функция будет видима везде.

В заключение перечислим основные свойства и правила использования статической памяти:

компоненты-данные и компоненты-функции класса можно объявить статическими (static);

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

статические компоненты не являются частью объектов класса;

статические компоненты глобального (внешнего) класса имеют внешнюю компоновку;

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

статические компоненты-функции не имеют указателя tiiis, поэтому они могут обращаться к нестатическим компонентам класса только с использованием операторов . или ->;

статические компоненты-функции не могут быть виртуальными;

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

локальный класс не может иметь статических компонентов;

если класс CL имеет статический компонент st, то к нему можно обращаться как к CL::st, т. е. независимо от объектов этого класса. Однако к нему можно обратиться и с использованием операторов . и ->, если заданы соответствующие объекты;

статический компонент существует даже при отсутствии объектов соответствующего класса;



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

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

тип статических компонентов не включает имя класса, в котором они объявлены.

3.11. Структуры и смеси

Вместо ключевого слова class в языке С++ можно использовать ключевое слово struct. В этом случае структура тоже будет определять класс, объединяющий компоненты-данные и компоненты-функции, однако все компоненты структуры по умолчанию будут иметь атрибут public. Напомним, что все компоненты класса имеют атрибут private по умолчанию.

Смесь - это структура, в которой каждый компонент размещается в памяти на одном и том же месте (правильнее сказать, каждый компонент смеси имеет один и тот же адрес в памяти). При этом предполагается, что в одно и то же время будет использован только один компонент смеси, в другое же время значение этого компонента безразлично и мы можем записать на его место в памяти значение другого компонента. Использование такого подхода позволяет экономить память.

Рассмотрим примеры. Первый из них показывает объявление структур и различные способы передачи их в функции.

#include <iostream.h> struct my struct { char *str;

my struct(char *S) ; str(S) {} это конструктор void display str() { cout str << endl; }

void f 1(my struct m s) передача структуры в функцию { m s.display str(); }

void f2(my struct &m s) передача ссылки на структуру

в функцию



{ m s.display str(); } my struct ms( via pointer );

void f3(my struct *ms) передача указателя на структуру

в функцию

{ ms->display str(); }

void main(void)

{ my struct m s( directly );

f1(m s); Результат: directly

my struct rm s( as a reference );

f2(rm s); Результат: as a reference

f3(&ms); Результат: via pointer

Второй пример демонстрирует использование анонимных объединений (или смесей). Глобальные анонимные объединения должны быть статическими (объявляться со спецификатором static). #include <iostream.h>

static union { это глобальное анонимное объединение (смесь) int а; float b;

char с; };

void main(void) {

union { это локальное анонимное объединение (смесь) int а; float b;

char с; };

::а = 10; а = 20; здесь а - локальная и ;:а -

глобальная переменные cout ;:а \t а endl; Результат: 10 20 ::Ь = 123.456; b = 555.666; cout ::b \t b endl;

Результат: 123.456 555.666

::c = x; с = #;

cout ::c \t с endl; Результат: x#



1 ... 34 35 36 [ 37 ] 38 39 40 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика