Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 19. Копирующий конструктор 207




При попытке скомпилировать программу с таким объявлением вы получите сообще- ние об ошибке.

Давайте подумаем, почему аргумент конструктора обязательно должен быть ссылкой?  Представим,  что                на тип аргумента копирующего конструк- тора нет. В этом  случае,  когда  вызовет функцию f n {), компилятор C++ использует копирующий конструктор для создания копии объекта класса

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

 


Часть                                программирование


Глава20


Статические члены

Определение статических членов Объявление статических функций-членов Бюджет с классами —                                . СРР

 

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

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

членов

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

 

Зачем нужны статические данные

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

Такую информацию можно хранить в обшей (и ставшей привычной) глобальной переменной. Например, можно использовать простую целочисленную переменную для отслеживания количества объектов student . Однако при таком подходе возникает проблема, связанная с тем, что эти переменные находятся "снаружи" класса. Это по- добно, например, установке регулятора напряжения моей микроволновой печи где- нибудь в спальне. Конечно, так можно сделать, и печь, вероятно, даже будет нор- мально работать, но моя собака во время очередной пробежки по квартире может на- ступить на провода и ее придется соскребать с потолка, что вряд ли доставит мне удо- вольствие (собаке, я думаю, это тоже не очень-то понравится).

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

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

Глава 20. Статические члены                                                          209


Использование статических членов

Статические данные-члены объявляются в классе с помощью ключевого слова static , как показано в приведенном ниже примере.

class Student

 

 

Student fchar     "no

{

 

 

()

{

 


| int

{

}


 

return


protected:

static int char

 

Student Student s2;

Член noOfStudents входит в состав класса student , но не входит в состав объек- тов  и s2. Таким образом, для любого объекта  класса                                               существуют отдель- ные члены name и  только один который доступен для всех объектов класса

"Хорошо, — спросите вы, — если место под noOfStudents не выделено ни в ка- ком объекте класса то где же он находится?" Ответ прост: это место не деляется. Вы должны сами выделить для него место так, как показано ниже.

int                                                   - 0;

Этот своеобразный синтаксис вьщеляет место для статического члена класса и инициа- лизирует его нулем. Статические данные-члены должны быть глобальными (как статиче- ские переменные не могут локальными по отношению к некоторой функции).

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

 

 

Обращение к статическим данным-членам

Правила обращения к статическим данным-членам те же, что и к обычным чле- нам. Из класса к статическим членам обращаются так же, как и к другим членам класса. К открытым статическим членам можно обращаться извне класса, а к защи- щенным — нельзя, как и к обычным защищенным членам.

class Student

{

public:

 

 

210                         Часть ///. "Классическое" программирование


//обращение из класса

/'/. .      программа. . .

 

 

static int noOfStudents;

же, что и раньше...

 

void                                     Student s2)

 

//обращение к открытому статическому члену cout « "Количество студентов - "

<<                                                      //обращение извне

<< "\п" ;                                        //класса

}

В функции fn () происходит обращение к                                    с использованием объек-

та Однако, поскольку и s2 имеют одинаковый доступ к члену noOfStudents, возникает вопрос: почему я выбрал именно Почему я не использовал s2? На са- мом деле это не имеет значения. Вы можете обращаться к статическим членам, ис- пользуя любой объект класса, например, так:

определяется так же, как и раньше... void Student s2)

1

//представленные команды приведут к идентичному результату cout << "Количество студентов - "

<<               "\n";

cout << "Количество студентов - "

<<            << "\n";

 

На самом деле нам вообще не нужен объект! Можно использовать просто имя класса, как показано в следующем примере:

определяется так же, как и void  fn;student&      Student

 

// результат                    неизменным

cout  <<                           студентов - "

<<

<< "\n" ;

 

Независимо от того, будете ли вы использовать имя объекта или нет, C++ все рав- но будет использовать имя класса.

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

 

class Student

 

static int

nextStudent (); же, что и

 

void        s)

 

cout «                           <<


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 189; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.035 с.)
Главная | Случайная страница | Обратная связь