Операция разрешения видимости
Обозначается двумя двоеточиями :: . Используется для обращения к глобальной переменной, имеющей такое же имя, как и у локальной.
Если перед идентификатором переменной стоят два двоеточия, значит используется глобальная переменная.
Пример
#include <stdio.h>
double x=1Ø; //глобальная переменная
void main( )
{
double x=1ØØ; //локальная переменная
printf(“Глобальная переменная х=%f\n”,::x);
printf (“Локальная переменная x=%f\n”,x);
for (int i=Ø;i<2;i++)
{
double x=1ØØØ; //Переменная, существующая только в этом блоке
printf(“Внутри блока x=%f\n”,x);
}
}
Операция разрешения видимости используется также для обращения к элементам классов, о чем будет сказано позже.
Встроенные (inline) функции
inline – модификатор определения функции. Предписывает компилятору помещать расширение тела функции везде, где происходит обращение к ней, вместо того, чтобы генерировать код вызова. В inline - функциях недопустимы операторы while, do while, for, switch, goto , а также ассемблерные вставки.
ВНИМАНИЕ! inline - функция должна быть определена до первого ее вызова. Даже если перед прототипом поставить ключевое слово inline, но определить эту функцию после ее вызова, то компилятор генерирует вызов (!) функции вместо создания inline -расширения.
Если inline - функция не является методом класса (об этом позже), то слово inline пишут при определении функции, а не перед прототипом.
Пример.
#include <stdio.h>
inline float min(float a,float b)
{
return a>b? a:b;
}
void main ( )
{
float x,y,v;
puts(“введите x,y”);
scanf (“%f%f”,&x,&y);
v=min( x, y);
printf(“v=%f\n”,v);
}
На месте вызова функции min( ) будет код тела этой функции.
Встроенные функции позволяют увеличить быстродействие программы. Однако применение больших inline - функций может привести к увеличению объема кода программы.
17.4 Гибкие операторы динамического распределения памяти: new, delete
Для управления распределением динамической памяти С++ предоставляет операторы new и delete (или new[ ], delete[ ]). В программах на языке С использовались для этой цели библиотечные функции malloc( ), calloc( ) и free ( ). Эти функции, как и все функции С, можно использовать и в С++. Однако операторы С++ обладают расширенными возможностями. Так, функции malloc( ), calloc( ) возвращают пустой указатель void*. Поэтому в случае необходимости выделить память под какой-либо тип переменной, отличный от void, в С++ требуется явное преобразование типа. В то же время new возвращает указатель на тот тип, для которого выделяется память. Обращение к оператору new имеет вид:
указатель_на_тип=new тип;
указатель_на_тип=new тип [количество_элементов];
Например:
char*pch;
pch=new char; //Выделение памяти под 1 символ
pch=new char[1Ø]; //Выделение памяти под 10 символов.
Освобождается память с помощью оператора delete.
Delete указатель_на_тип;
delete[ ] указатель_на_тип;
Второй вариант вызова delete необходимо использовать при освобождении памяти, выделенной функцией new[ ] под массив.
Примеры:
1)int*pi=new int;
*pi=124;
delete pi;
2)struct car
{
- - -
};
car*pcar=new car[1Ø];
/* выделена память под 10 элементов car */
delete [ ] pcar; //освободили память
Для сравнения приводится malloc( ) и free( ).
struct flower
{
- - -
};
flower*pflower;
pflower=(flower*)malloc(1Ø*sizeof(flower));
free(pflower);
17.5 Объектно-ориентированное программирование на С++. Классы в С++
Класс является фундаментальным механизмом,с введением которого язык С получает объектно-ориентованные свойства и становится языком С++. Он разрешает создавать типы и определять поведение типа.
Каждый представитель класса называется объектом. В некотором смысле можно рассматривать класс как средство расширения языка.
Определение класса напоминает определение структуры в С за исключением того,что оно обычно содержит одну или несколько спецификаций доступа с помощью ключевых слов public,protected,private.
Вместо ключевого слова struct могут употребляться classили union.
-Определение класса может включать в себя функции (функции-элементы или методы) наравне с элементами данных. В нем также могут быть некоторые специальные функции, такие,как конструктор(функция с тем же именем, что и сам класс) и деструктор(функция, именем которой является имя класса с префиксом-тильдой(~)).
Пример
Class man
{
private:
char name[10];
char adres[20];
public:
Void get_info();
Void put_info();
};
В этом примере показано,что, кроме данных о человеке , есть еще две функции для ввода и вывода этих данных:get_info(),put_info().
В языке С элементы структуры доступные для другой функции в границах ее области действия. Это часто приводит к изменению данных из-за невнимательности. В С++ можно ограничить видимость данных и функций класса с помощью меток public,protected,private. Метка-спецификатор доступа применяется ко всем элементам класса, которые следуют за ней, пока не встретится другая метка или закончится определение класса.
Если спецификатор доступа private, это означает, что элементы данных и функции-элементы доступные только для функций-элементов данного класса.
Если public, то элементы данных и функции-элементы доступные для функций-элементов и других функций программы, в которых есть представитель класса.
Если protected , тоэлементы данных и функции-элементы доступные для функций-элементов данного класса и классов, производных от него.
В С++ структура, класси объединение рассматриваются как типы классов.Структура и класс похожие за исключением доступа по умолчанию.
В структуре по умолчанию элементы имеют доступ public,а в классе-private.
Объединение по умолчанию дает доступ public.
Аналогично объединению в С его элементы данных размещаются,начиная с одного и того же места в пам΄яти.
Элементы класса
Делятся на две категории:
-данные, которые называются элементами-данными (data members) ;
-элементы-функции (member functions) или методы.
Элементы-данные похожи на элементы структуры языка С с некоторыми дополнениями:
-Элементы данных не могут определяться как auto,extern,register.
-Элементами данных могут быть перечисляемые типы, битовые поля или представители ранее представленного класса.
-Элементом данных не может быть представитель именно этого класса.
-Элементом данных класса может быть указатель или ссылка на представителя этого класса.
Элементы-функции
Элемент-функция описывается при определении класса. Само определение функции может также быть приведено внутри определения класса.В этом случае функция является встроенной (inline) функцией-элементом.
Если определение функции приводится вне границ определения класса, то перед ее именем ставится префикс из имени класса и операции разрешения видимости(::).
Пример.
Class car
{
private:
char marka[10];
char color[15];
Float cost;
public:
Void get_info();
Void put_info()
{
printf(“Марка автомобиля %s\n”,marka);
printf(“Его цвет %s\n”,color);
printf(“Цена -%f\n”,cost);
}
};
void car::getinfo()
{
puts(“Введите марку автомобиля”);
Fflush(stdin);
scanf(“%s”,&marka);
puts(“Введите его цвет”);
Fflush(stdin);
scanf(“%s”,&color);
puts(“Сколько он стоит?”);
scanf(“%f”,&cost);
}
В этом примере определение элемента-функции put_info() находится внутри определения класса car, то есть она является inline-функцией. А определение функции get_info() приведено вне границ определения класса.
Доступ к элементам данных
Функции-элементы могут обращаться к другому элементу класса,используя просто его имя.Обычные функции или функции-элементы другого класса могут получить доступ к элементам данных с помощью операций точка (.) или ->. Они применяются соответственно к представителю или к указателю на представителя класса.
Пример
Class coord
{
public:
Int x,y;
};
Void main()
{
coord arg;//Создается локальный объект
coord*p=&arg;//Указатель на объект
arg.x=10;//Имя объекта.элемент
p->y=5;//Вместо arg.y=5;
}
Вызов функций-элементов
Функции-элементы класса могут вызывать другие функции-элементы того же класса, просто используя имя нужной функции. Обычные функции или функции-элементы других классов могут вызвать функции-елементы с помощью операций точка (.) или ->как и для элементов данных.
Пример
Class coord
{
private:
Int x,y;
public: