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

1 ... 14 15 16 [ 17 ] 18 19 20 ... 159


free store

память

объект типа double


вьщеление памяти

I--1

d = new double;

double* d;

Puc. 2.1. Использование оператора new

И др. В языке С!++ для чгих целей можно применять встроенные операюры new и ddilc (по к:ночевые слова языка С++). Эти операторы лумтс .niajioi ичных функций языка С. Рассмотрим их более иодроПио.

Оператор new имсс! один операнд (это унарный оператор). Его можно загпгса 1 ь и двух (1)<)рмах:

<::> new <(new arg)> type name <(initializer)>

<::> new <(new arg)> (type name) <(initializer)>

Здесь в угловых скобках (< ... >) указаны необязательные компоненты. Поэтому в простейшем виде оператор new можно записать так:

new type name или new (type name)

Оператор new возвращает указатель на объект типа type name, под который осуществляется динамическое выделение памяти, где type name - единственный обязательный операнд этого оператора. Рассмотрим пример:

double* d; d - указатель на объект типа

double

d = new double; вьщеление памяти под объект типа double (см.рис. 2.1)

Оператор new записывают и в другой форме: d = new (double);



В качестве аргумента можно использовать как стандартные типы (int, long, char и т. п.), так и новые типы, определенные пользователем. В последнем случае именем типа будет имя соответствующего класса. В любом случае оператор new возвращает указатель на объект заданного типа, т. е. здесь не нужно выполнять преобразования типа, как это, например, осуществлялось в языке С для функции malloc. Если память не может быть выделена, оператор new возвращает значение NULL.

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

int* 1; i - указатель на целое

i = new int[100]; выделение памяти для массива

Разрещается выделять память как для одномерного (см. пример выще), так и для многомерного массива:

int ptr = new int[3][4][5];

Все размерности массива, кроме первой, должны быть константами (константными выражениями). Первая размерность может быть задана переменной, значение которой будет известно к моменту использования оператора new, например:

lnt ptr = new int[j][4][5];

Здесь указатель в левой части выражения должен иметь правильный тип, например:

int (*р)[] = new int[2][3];

Когда выделяется память под объект, значение объекта (значение, записанное в этой памяти) будет неопределенным. Однако объекту можно присвоить начальное значение в процессе обращения к оператору new, используя необязательный параметр initializer, и.шример:

long* I = new long(123456L);

Здесь суффикс L говорит о том, что берется длинная целая (а не обычная целая) константа. Теперь 1 будет указывать на длинное целое значение - 123456. К сожалению, этот параметр (initializer) нельзя использовать для инициализации массивов. В то же время на место initializer можно поместить спи-



СОК значений (через занягую), которые будут передаваться конструктору при выделении памяти под новый объект, заданный пользователем.

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

Рассмотрим другие необязательные параметры оператора new.

Если испо;п.зуется знак ::, то вызывается глобальная версия оператора new. Дадим некоторые пояснения, к которым можно будет перпуться, прочитав гл. 5. На самом деле оператор new пьгплвает функцию operator new() для того, чтобы получить намять. Аргумент (type name) new используется для автоматического вычисления размера памяти с помощью оператора sizeof(typc name), т. е. запись new type name; приводит к вызову функции operator new(sizeof(type name));. Когда объект имеет стандартный тип (не класс), то вызывается глобальная функция operator:

::operator new(sizeof(type name));

Если type name - это имя класса и существует доопределенная версия оператора new для этого класса, то вызывается функция:

type name::operator new();

Если доопределенная версия не существует, вызывается глобальный оператор new. Использование знака :: гарантирует, что всегда будет вызвана глобальная версия, даже если доопределенная версия оператора new по отношению к классу type name существует.

При необходимости в функцию operator можно передать дополнительные аргументы (см. параметр new arg), например следующее использование этого оператора:

new(5,a) Т; Т - имя класса приводит к вызову функции T::operator new(5,a).

Оператор new можно использовать для выделения памяти под массивы указателей. Ниже демонстрируется выделение памяти под массив, содержащий 7 указателей на функции без аргументов, и эти функции возвращают значение float:



1 ... 14 15 16 [ 17 ] 18 19 20 ... 159

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