Объектно-ориентированное программирование - Учебное пособие (А.А. Хусаинов)

1.4. операторы динамического распределения памяти

 

Для выделения и освобождения памяти в Си++ можно применять новые унарные операции – new и delete, соответствующие функциям malloc и free в Си.

Формат операций:

new TYPE         Выделяет область памяти для переменной типа TYPE и   возвращает его адрес.

new TYPE (значение)  Действует как предшествующая операция и инициализирует область памяти начальным значением.

new TYPE [n]   Выделяет область памяти для массива из n элементов и возвращяет его адрес.

delete p Освобождает область памяти, на которую ссылается указатель p.

delete []p           Освобождает область памяти, занятую массивом, на который ссылается указатель p.

Пример. Приведём подпрограмму конкатенации строк, возвращающую адрес строки, полученной объединением двух строк.

 

// peregr.cpp

#include <iostream.h>   //библиотека ввода-вывода

#include <conio.h>                    //консольный ввод-вывод

#include <string.h>                   //библиотека функций для работы со строками

 

char* conc(char* s, char* t)

{

int i;                                          

char *res=new char[strlen(s)+strlen(t)+1];        //результирующая строка

   for (i=0; i<strlen(s); i++)

res[i]=s[i];          //копируем в результат сначала

                           //первую строку

   for (i=strlen(s); i<strlen(s)+strlen(t); i++)

                           res[i]=t[i-strlen(s)];      //а затем вторую

   res[i]=0;                                               //строка должна завершаться нулём

   return res;                                           

}

 

void main()

{

  char* p="abc",*q="1234";                   //объявим две строки p и q

  clrscr();

  cout<<"Входные данные: Первая строка  "<<p;

  cout<<" Вторая         "<<q;

  cout<<" Выходные данные: ";

  cout<<"Результат конкатенации первой и второй строки              ";

  cout<<conc(p,q)<<" ";                                   //результат конкатенации p и q -

                                                                           //"abc1234"

  cout<<"Результат конкатенации первой второй и снова первой строк  ";

  cout<<conc(conc(p,q),p)<<" ";          //результат конкатенации (p и q)

                                                                           //и p - "abc1234abc"

  getch();                                                            //ожидание нажатия клавиши

}

 

Реультаты работы программы представлены на рис. 1.1.

 

Подпрограмма conc() учитывает, что размер строки, полученной после объединения двух строк, равен сумме размеров этих строк. Здесь функция strlen() - стандартная и возвращает количество первых символов строки, не равных 0. Длина строки, вместе с завершающим ее нулем, равна strlen()+1. В данном примере сначала переписываются символы первой строки в результирующую строку res, а затем символы второй строки. В конце строки добавляется 0. Возвращается указатель на результирующую строку res.

Замечание. В рассмотренном примере вывод производится с помощью операции cout<<данные. Аналогичным образом в Си++ можно осуществлять ввод: cin>>данные. Например, вместо операторов:

 

Scanf(“\%d”,&x);           printf(“ x=\%d”,x);

 

для переменной x целого типа, можно написать:

 

cin>>x;              cout<<” ”<<x;

 

указав в начале программы #include <iostream.h>. Отметим, что ввод с помощью cin отличается тем, что не требуется символ &.