ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3282

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рис. 14.1. Структурная переменная ms "живет"

втой же области памяти, что и переменная п,

вто время как память для объекта тс выделя­ ется в отдельной области памяти

Отличие между ссылками и типами-значениями еще более очевидно в следующее примере. Создание массива из 100 ссылочных объектов требует от программы 101 вызов оператора new (один для массива и по одному для каждого объекта):

M y C l a s s [ ] mc = new M y C l a s s [ 1 0 0 ] ;

f o r ( i n t i = 0; i < m s . L e n g t h ; i + + )

{

mc [ i ] = new M y C l a s s ( ) ;

}

m c [ 0 ] . n = 0;

Массив также приводит к определенным накладным расходам, как в смысле времеyb работы, так и используемой памяти.

Каждый элемент в массиве тс должен быть достаточно большим, чтобы содер­ жать ссылку на объект.

Каждый объект M y C l a s s имеет невидимые накладные расходы памяти до и после единственного члена-данных п.

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

Память для объекта структуры выделяется сразу, как для части массива:

/ / О б ъ я в л е н и е м а с с и в а i n t

 

 

 

i n t [ ]

i n t e g e r s

=

new i n t [ 1 0 0 ] ;

/ /

Выделение

п а м я т и

i n t e g e r s [ 0 ]

= 0;

 

 

 

 

/ / О б ъ я в л е н и е м а с с и в а с т р у к т у р т а к о е ж е п р о с т о е

 

M y S t r u c t [ ]

ms

=

new M y S t r u c t [ 1 0 0 ] ;

//

Выделение

п а м я т и

ms [ 0]

. n =

0;

 

 

 

 

 

В этом случае выделяется один большой блок памяти.

328

Часть V. За базовыми классами


Конструктор структуры

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

public s t r u c t

M y S t r u c t

{

 

 

public

i n t

n ;

public

d o u b l e d;

}

HyStruct ms = new M y S t r u c t ( ) ; // И с п о л ь з о в а н и е new

Несмотря на внешний вид, такая инициализация не приводит к выделению памяти

вотдельной области — она всего лишь обнуляет поля п и d.

Вы можете создать собственный конструктор, выполняющий какие-то другие дейст­

вия. Рассмотрим следующий исходный текст:

public

s t r u c t

T e s t

 

(

 

 

 

 

 

; private

i n t

n;

 

 

public

T e s t

( i n t n )

 

{

 

 

 

 

 

t h i s . n =

n;

 

 

public

c l a s s

P r o g r a m

 

{

 

 

 

 

 

public

s t a t i c

v o i d

Main ( s t r i n g [ ] a r g s )

{

 

 

 

 

 

Test

t e s t

=

new

T e s t ( 1 0 ) ;

Несмотря на свой внешний вид, объявление t e s t = new T e s t (10) ; не выделя­ ет память, а только инициализирует уже выделенную память для типов-значений. Об­ ратите внимание на использование круглых скобок, в отличие от массива, где скоб- ки—квадратные.

Методы структур

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

циальным

образом указывается в вызове функции с помощью

ключевого слова r e f .

Структура

не может наследовать класс (отличный от O b j e c t ,

который будет описан

позже в данной главе) и не может наследоваться другими классами. Структура может реализовывать интерфейс.

Отличия между статическими членами и членами экземпляра описаны в гла­ ве 8, "Методы класса". В главе 7, "Функции функций", вы найдете информа­ цию о передаче функции аргументов по значению и по ссылке. Наследование рассматривается в главе 12, "Наследование".

Гш 14. Интерфейсы и структуры

329



Все классы (и структуры) наследуют один тип O b j e c t , сказано об этом яв но или нет. Вы можете перекрывать методы O b j e c t . С практической точки зрения единственный метод, который вы можете захотеть перекрыть — это метод T o S t r i n g ( ) , позволяющий объекту создавать строковое представле­ ние информации о самом себе. Если вы не реализуете собственный метод T o S t r i n g ( ) , то метод по умолчанию класса O b j e c t вернет полное имя класса, например MyNamespace . M y C l a s s . Обычно в этом мало толку.

Пример применения структуры

 

Следующая демонстрационная программа иллюстрирует различные воз­

 

можности структур:

 

 

 

 

 

 

/ / S t r u c t u r e E x a m p l e - д е м о н с т р а ц и я р а з л и ч н ы х с в о й с т в

 

/ / с т р у к т у р н о г о о б ъ е к т а

 

 

 

 

 

 

u s i n g

S y s t e m ;

 

 

 

 

 

 

 

 

 

 

u s i n g S y s t e m . C o l l e c t i o n s ;

 

 

 

 

 

 

n a m e s p a c e S t r u c t u r e E x a m p l e

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

p u b l i c i n t e r f a c e

I D i s p l a y a b l e

 

 

 

 

 

s t r i n g T o S t r i n g ( ) ;

 

 

 

 

 

 

 

/ / С т р у к т у р а

может

р е а л и з о в ы в а т ь

и н т е р ф е й с

 

 

 

p u b l i c s t r u c t T e s t

:

I D i s p l a y a b l e

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

/ /

С т р у к т у р а

может

и м е т ь

члены

к а к

о б ъ е к т а ,

т а к

и

к л а с с а

/ /

( с т а т и ч е с к и е ) ;

с т а т и ч е с к и е

члены

м о г у т и м е т ь

 

 

/ / и н и ц и а л и з а т о р ы

 

 

 

 

 

 

 

p r i v a t e

i n t n ;

 

 

 

 

 

 

 

 

p r i v a t e s t a t i c d o u b l e d = 2 0 . 0 ;

 

 

 

 

//

Для

и н и ц и а л и з а ц и и ч л е н о в - д а н н ы х

с т р у к т у р ы

может

 

/ / и с п о л ь з о в а т ь с я к о н с т р у к т о р

 

 

 

 

 

p u b l i c T e s t ( i n t n )

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

t h i s . n =

n ;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

/ /

С т р у к т у р а

может

и м е т ь

с в о й с т в а к а к о б ъ е к т а ,

т а к

и

/ / к л а с с а

( с т а т и ч е с к и е )

 

 

 

 

 

 

p u b l i c

i n t

N

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

g e t { r e t u r n n ; } s e t { n = v a l u e ;

p u b l i c s t a t i c d o u b l e D

{

330

Часть V. За базовыми классами


g e t { r e t u r n d;

}

s e t { d = v a l u e ; }

}

 

 

// С т р у к т у р а

может

и м е т ь методы

p u b l i c v o i d

C h a n g e M e t h o d ( i n t nNewValue,

d o u b l e dNewValue)

{

n = n N e w V a l u e ; d = d N e w V a l u e ;

}

// T o S t r i n g - п е р е к р ы т и е м е т о д а T o S t r i n g О и р е а л и з а ц и я / / и н т е р ф е й с а I D i s p l a y a b l e

o v e r r i d e p u b l i c

s t r i n g T o S t r i n g ( )

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

r e t u r n s t r i n g . F o r m a t ( " ( { 0 : N } ,

{ l : N } ) ' \

n , d ) ;

 

p u b l i c c l a s s P r o g r a m

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

p u b l i c

s t a t i c v o i d M a i n ( s t r i n g [ ]

a r g s )

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

/ / С о з д а н и е о б ъ е к т а T e s t

 

 

 

 

 

 

T e s t

t e s t

=

new T e s t ( 1 0 ) ;

 

 

 

 

 

 

C o n s o l e . W r i t e L i n e ( " Н а ч а л ь н о е з н а ч е н и е t e s t " ) ;

 

O u t p u t F u n c t i o n ( t e s t ) ;

 

 

 

 

 

 

//

Попытка

м о д и ф и ц и р о в а т ь

о б ъ е к т ,

п е р е д а в а я

е г о

в

/ / к а ч е с т в е а р г у м е н т а

 

 

 

 

 

 

C h a n g e V a l u e F u n c t i o n ( t e s t ,

1 0 0 ,

2 0 0 . 0 ) ;

 

 

 

C o n s o l e . W r i t e L i n e ( " З н а ч е н и е t e s t п о с л е в ы з о в а " +

 

 

 

 

 

 

" C h a n g e V a l u e F u n c t i o n ( 1 0 0,

2 0 0 . 0 ) " ) ;

O u t p u t F u n c t i o n ( t e s t ) ;

 

 

 

 

 

 

//

Попытка

м о д и ф и ц и р о в а т ь

о б ъ е к т ,

п е р е д а в а я

е г о

в

/ / к а ч е с т в е а р г у м е н т а

 

 

 

 

 

 

C h a n g e R e f e r e n c e F u n c t i o n ( r e f t e s t ,

1 0 0 ,

2 0 0 . 0 ) ;

 

C o n s o l e . W r i t e L i n e ( " З н а ч е н и е t e s t п о с л е в ы з о в а " +

 

 

 

 

 

" C h a n g e R e f e r e n c e F u n c t i o n ( 1 0 0 ,

2 0 0 . 0 ) " ) ;

O u t p u t F u n c t i o n ( t e s t ) ;

 

 

 

 

 

 

//

Метод

может

м о д и ф и ц и р о в а т ь

о б ъ е к т

 

 

 

t e s t . C h a n g e M e t h o d ( 1 0 0 0 , 2 0 0 0 . 0 ) ;

 

 

 

 

C o n s o l e . W r i t e L i n e ( " З н а ч е н и е t e s t п о с л е в ы з о в а " +

 

 

 

 

 

 

" C h a n g e M e t h o d ( 1 0 0 0 , 2 0 0 0 . 0 ) " ) ;

O u t p u t F u n c t i o n ( t e s t ) ;

 

 

 

 

 

 

/ /

Ожидаем

п о д т в е р ж д е н и я

п о л ь з о в а т е л я

 

 

 

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

 

 

 

 

 

 

 

" з а в е р ш е н и я п р о г р а м м ы . . . " ) ;

 

Глава 14. Интерфейсы и структуры

331