Объявление структур, объединений, перечислений

В С++ введен упрощенный синтаксис для определения переменных, типа структур, объединений и перечислений, в котором можно опускать ключевые слова struct, union, enum.

//C

enum day{sun,mon,tue,wen};

struct path{char str[30];

enum day Week;}

struct path Link;

//C++

enum day{sun,mon,tue,wen};

struct path{char str[30];

day Week;}

path List;

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

struct Goods{

char *name;

union{double d, long l, int i)};

};

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

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


Классы и объекты. Определение класса и области видимости. Опережающее объявление класса

Определение класса в области видимости

Класс – это тип данных, определенный пользователем и представляющий набор данных и множество операций для работы с этими данными. При объявлении используются общие правила объявления.

В языке в С++ поддерживается 2 области видимости: область видимости файла, локальная область видимости, область видимости класса. Объявленные в области видимости файла видны до конца файла. Локальная область видимости – в ней видны только в этом блоке. Локальное объявление перекрывает глобальное. Член-данные и методы класса видны только в видимости класса. Вне его требуется уточнение имени объекта или класса.

Для ограничения доступа используется 3 спецификатора: public, private и protected. Член класса виден и может быть использован во всем классе независимо от точки объявления, а в определении класса и до своего определения.

int var;

class Ex

{

public:

f(){var =0};

private:

int var;//речь будет идти об этой переменной

}

Член функция класса имеет область видимости класса и определяет собственную локальную область видимости аналогично обычной функции С.

class Point2D

{

double x,y;

public:

Point2D(double x, double y)

{

Point2D::x=x;

Point2D::y=y;

}

}

Опережающее объявление класса

exteen int count;

struct POINT;

class Point2D;

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


Использование спецификатора класса памяти static.

Статические компоненты класса

Типы памяти

  1. Статические объекты создаются и инициализируются в статическом сегменте данных и остается там не меняя своего положения до конца программы.
  2. К автоматическому классу памяти относятся переменные, типы класса. Автоматические объекты создаются в стеке и завершают свое существование при выходе из программы.
  3. Динамические создаются, инициализируются и уничтожаются по требованию программиста. Они создаются в С++ при помощи new и delete.

Иногда возникает необходимость, чтобы все объекты имели доступ к какой-то одной общей переменной, а не копии переменной в каждом объекте. Эта переменная, например, может быть счетчиком, флажком и другое. Для того, чтобы элемент данного класса разделял всеми объектами данного класса и находилось в фиксированном месте в памяти, его нужно объявить с ключевым словом static.

class Point2D

{

double x,y;

static int count;

public:

Point2D(double x, double y)

{

x=_x;

y=_y;

count++;

}

~Point2D()

{

count--;

}

};

//point2d.cpp

int Point2D::count;

Объявление статической переменной не является его определением. Поэтому в каком-либо из модулей надо определить его и если надо провести инициализацию. При этом надо использоваться полное имя данных.

//получение доступа к объекту

cout<<Point2D::Count<<”\n”;

Для открытия доступа к открытому или защищенному типу, должна быть предусмотрена открытая статическая член-функция, которая должна вызываться с добавлением перед ее именем имени класса.

static int GetCount()

{

return count;

}

cout<<Point2D::GetCount();

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

Замечания:в создании и инициализации статических данных происходит при запуске программы в порядке поступления их определений на вход компоновщика. Однако не следует проектировать программу так, чтобы их работа зависела от порядка создания и инициализации статических данных.