Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

3.3.1 Корректное использование аргументов по умолчанию

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

При использовании значений аргументов по умолчанию необходимо также учитывать следую­щее правило: никакое значение аргумента по умолчанию не должно вызывать вредных или разру­шительных последствий. Иначе говоря, случайное использование значений аргументов по умол­чанию не должно вызывать катастрофы.

3.4 Взаимосвязь классов и структур

В языке C++ расширены возможности структуры, если сравнивать их с языком С. В C++ классы и структуры тесно взаимосвязаны. Фактически, за одним исключением, они взаимозаменяемы, по­скольку структура в C++ может включать как данные, так и код, который может манипулировать этими данными таким же образом, как и класс. Структуры также могут содержать конструкторы и деструкторы. Единственное отличие между ними связано с тем, что по умолчанию члены класса имеют в качестве спецификатора доступа private, тогда как спецификатором доступа членов струк­туры служит public. Согласно формальному синтаксису C++, ключевое слово struct определяет тип класса. В качестве примера рассмотрим структуру:

struct cl

{

int get_i();

void put_i(int j);

private:

int i;

};

int cl::get_i()

{

return i;

}

void cl::put_i(int j)

{

i = j;

}

В большинстве случаев программисты, работающие на языке C++, используют классы для опре­деления объектов, содержащих и данные и код. Они используют структуры для определения объек­тов, содержащих только данные. Это означает, что структуры используются обычно точно в том же стиле, что и структуры в языке С.

3.5 Связь объединений и классов

Точно так же, как структуры и классы связаны между собой, связаны и объединения и классы. Объединения представляют по существу структуру, в которой все элементы хранятся в одном и том же месте. Объединения могут содержать конструкторы и деструкторы, а также функции-члены и дружественные функции. Подобно структурам, члены объединения по умолчанию имеют в качестве спецификатора доступа public. Например, следующая программа использует объедине­ние для вывода символов, соответствующих старшему и младшему байтам короткого целого (име­ющего размер в два байта как для 16-битных, так и для 32-битных сред):

#include <iostream.h>

union u_type

{

u_type(short int a);

void showchars();

short int i;

char ch[2];

};

u_type::u_type(short int a)

{

i = a;

}

void u_type::showchars()

{

cout << ch[0] << " ";

cout << ch[1] << "\n";

}

int main()

{

u_type u(1000);

u.showchars();

return 0;

}

Важно понимать, что подобно структуре, объявление объединения определяет тип класса. Это означает, что принципы инкапсуляции сохраняют свою силу.

Имеется несколько ограничений, которые необходимо иметь в виду при использовании объе­динений в C++. Первое — объединение не может наследовать какие-либо другие классы. Далее объединение не может использоваться в качестве базового класса. Объединение не может иметь виртуальные функции-члены. Никакие статичес­кие переменные не могут быть членами объединения. Объединение не может иметь в качестве члена какой-либо объект, перегружающий оператор =. Наконец, никакой объект не может быть членом объединения, если этот объект имеет конструктор или деструктор.