Для программистов и опытных пользователей




Скачать 4.44 Mb.
Название Для программистов и опытных пользователей
страница 9/32
Дата публикации 20.09.2014
Размер 4.44 Mb.
Тип Документы
literature-edu.ru > Авто-обзор > Документы
1   ...   5   6   7   8   9   10   11   12   ...   32

inline long min (long a, long b)

2. Введение в классы 75

i

return а < b ? а: Ь;

// double

inline double rain (double a, double b)

{

return a < b ? a: b;

int main ( )

cout « min(-10, 10)

cout « min(-10.01, 100.002) « "\n

cout « min(-10L, 12L) « "\n";

return 0;

Упражнения

  1. Вглаве 1 вы перегружали функцию abs() так, чтобы она находила абсолют
    ные значения типа int, long и double. Модифицируйте программу, чтобы
    функции стали встраиваемыми.

  1. Почему следующая функция может не компилироваться как

void f l ()

{

int i;

ford = 0; i < 10; i++) cout « i;

2.7. Встраиваемые ууи^пп в объявлении класса

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

76

#include

using namespace std;

class samp {

int i, j ; public:

samp (int a, int b) ;

/* Функция divisible (), которая здесь определяется, по становится встраиваемой.

V

int divisible() { return !(i%j); }

1;

samp: : samp (int a, int b)

{

i = a; j = b;

int main 0

{

samp obi (10, 2), ob2(10, 3) ;

// это истина

if (obi .divisible () ) cout « "10 делится на 2\п";

// это ложь

if (ob2.divisible () ) cout « "10 делится на 3\п";

return 0;

J

Как видите, код функции divisibleQ находится внутри объявления класса samp. Отметьте, что никакого другого определения функции divisible{) не нужно, это даже запрещено. Определение функции divisible() внутри класса samp автоматически заставляет ее стать встраиваемой функцией.

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

Отметьте, как именно функция divisibleQ задается внутри класса samp, осо­бенно само тело функции. Оно целиком расположено на одной строке. Та­кой формат для программ C++ является совершенно обычным, функция объявляется внутри объявления класса. Такое объявлен вится более компактным. Однако класс samp мог бы быть описан и

class samp { int i, j ;

2. Введение в классы 77

public:

samp(int a, int b) ;

/* Функция divisible () , которая здесь определяется, по

*/

int divisible()

return ! (i% j ) ;

Здесь в определении функции divisibleQ используется более или менее

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

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



1. Вероятно наиболее традиционным использованием встраиваемых
определяемых внутри класса, является определение конструктора и
тора. Например, класс samp может быть определен более эффективно:

ttinclude using namespace std;

class samp {

int i, j; public:

// встраиваемый конструктор

samp tint a, int b) { i a; j = b; }

int divisible() { return !{i%j); } )}

Определения функции samp() внутри класса samp достаточно, и никакого другого определения не требуется.

2. Иногда короткие функции могут включаться в объявление класса даже
когда преимущества встраивания мало что дают или вовсе не
Рассмотрим следующее объявление класса:

class myclass { int i;

78 Самоучитель C++

public:

myclass(int n) ( i = n; } void show(} { cout « i; }

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

  1. Переделайте класс stack из раздела 2.1, пример 1, так, чтобы в классе, где это
    возможно, использовались встраиваемые функции.

  2. Переделайте класс strtype из раздела 2.2, пример 3, так, чтобы в классе ис­
    пользовались

Проверка

главы

Теперь вам необходимо выполнить следующие упражнения и ответить на вопросы.

  1. Что такое конструктор? Что такое деструктор? Когда они вызываются?

  2. Создайте класс line, который рисует на экране линию. Храните
    линии в виде закрытой целой переменной len. Конструктор line

иметь один параметр — длину линии. Он должен сохранять длину линии и собственно рисовать линию. Если ваша система не поддерживает гра­фику, отобразите линию, используя символ *. Необязательное Для удаления линии используйте деструктор line.

3. Что выведет на экран следующая программа?

^include using namespace std;

int щщ ()

int i = 10;

long 1 = 1000000; double d = -0.0009;

2. Введение в классы 79_

cout « i « ' « 1 « ' ' « d;

cout « "\n";

return 0;

]

  1. Добавьте производный класс, который наследует класс агеа_с! из раздела
    2.3, упражнение 1. Назовите этот класс cylinder и пусть он вычисляет
    площадь поверхности цилиндра. Эта площадь задается так: 2 * pi * R2 +
    pi * D * Н.

  2. Что такое встраиваемая функция? В чем ее преимущества и недостатки?

6. Измените следующую программу так, чтобы все функции-члены по

стали встраиваемыми

#include using namespace std;

class myclass { int i, j;

public:

myclass (int x, int y) ; void show();

};

myclass::myclass(int x, int y) f

i = x;

j = Y;

J

void myclass ::show (}

{

cout « i « "" "" « j « "\n";

}

int main()

{

myclass count (2, 3);

count.show() ;

return 0;

  1. В чем отличие между классом и структурой?

  2. Правилен ли следующий

union {

float f;

unsigned int bits;

во

C++

Проверка усвоения

В этом разделе проверяется, хорошо ли вы усвоили материал этой и преды-

1. Создайте класс prompt. Для вывода на экран строки-приглашения вклю-

в класс конструктор. Помимо строки-приглашения конструктор выполнить ввод набранного вами целого. Сохраните это значение в'закрытой переменной count. При удалении объекта типа prompt должен звуковой сигнал, причем столько раз, сколько задано пользо-в переменной count.

  1. В главе 1 вы создали программу для преобразования футов в дюймы. Те­
    перь для этой цели создайте класс. Класс должен хранить число футов и
    его эквивалент в дюймах. Передайте конструктору класса число футов и
    при этом он должен вывести на экран число дюймов.

  2. Создайте класс dice, который содержит закрытую целую переменную.
    Создайте функцию го11(), использующую стандартный генератор случай
    ных чисел randQ, для получения чисел от 1 до 6. Функция roll()
    вывести это значение на экран.







классов

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

ние пройденного

тем как продолжить, вы должны правильно ответить на вопросы и сделать упражнения.

1. Пусть дан следующий класс, каковы имена его конструктора и деструктора?

class widgit {

int x, у; public:

// ... впишите конструкторы и деструкторы

  1. Когда вызывается конструктор? Когда вызывается

  2. Пусть дан следующий базовый класс, покажите, как он может

производным классом Mars.

class planet {

int moons;

double dist

double diameter;

double mass; public:

  1. Имеются два способа сделать функцию встраиваемой. Что это за способы?

  2. Приведите, по крайней мере, два ограничения на использование встраи-

функций.

82 Самоучитель C++

6. Пусть дан следующий класс, покажите, каким образом объявить объект ob, значение 100 передать переменной а, а значение X переменной с.

class sample {

int a;

char с; public:

sample(int x, char ch) {a - x; с = ch; }

3.1. Присваивание объектов

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

// Пример

#include

using namespace std;

class myclass { int a, b;

public:

void set (inti, int j) { a ~ i; b = j; } void show {) { cout « a « ' ' « b « "\n"; }

int main ( )




t

myclass ol,

o2;

ol.set(10,

4);

// ol присв

заивс

o2 = ol;




ol.show() ;




o2.show() ;




return 0;




о2

В этом примере переменным а и b объекта ol присваиваются

но значения 10 и 4. Далее объект ol присваивается объекту о2. Это приво-

Глава 3. Подробное изучение классов 83

дит к тому, что текущее значение переменной ol.a присваивается перемен­ной о2.а, а текущее значение переменной ol.b — o2.b. Таким образом, в процессе выполнения программа выведет на экран следующее:

10 4 10 4

Запомните, что присваивание двух объектов просто делает одинаковыми этих объектов. Два объекта остаются по-прежнему совершенно неза-и. Например, после выполнения присваивания вызов функции-ol.setQ для задания значения ol.a не влияет ни на объект о2, ни на его переменной а.



Важно понимать, что в инструкции присваивания можно использовать толь­ко объекты одинакового типа. Если тип объектов разный, то при ции появится сообщение об ошибке. Более того, важно не только типы объектов были физически одинаковыми, а чтобы одинаковыми были также имена типов. Например, следующая программа неправильна:

// Эта программа содержит ошибку #include using namespace std;

class myclass f

int a, b; public:

void set(int i, int j) { a = i; b = j; }

void show() { cout « a « ' ' « b « "\n"; }

/* Этот класс похож на класс myclass, но из-за другого имени класса для компилятора он считается другим типом.

*/

class yourclass I

int a, b; public:

void set(int i, int j) { a = i; b = j ; }

void show() { cout « a « ' ' « b « "\n"; }

int main()

{

rayclassol; yourclass o2;

ol.set(10, 4);

84 Самоучитель C++

о 2 = ol; // ОШИБКА, присваивание объектов

ol.show(); о2 . show () ;

return 0;

Несмотря на то что классы myclass и yourclass физически одинаковы, они трактуются компилятором как разные, поскольку имеют разные имена т

2. Важно понимать, что все данные-члены одного объекта при

присваивания присваиваются данным-членам другого объекта. Это относится и к сложным данным, таким как массивы. Например, в следующей версии уже знакомого нам класса stack символы реально помещаются только в стек si, но после выполнения присваивания массив stck объекта s2 также содер­жит символы a, b и с.




























СИМВОЛОВ







ttinclude using namespace std;

#define SIZE 10

// Объявление класса stack class stack {

char stck[SIZE]; // содержит int tos; // индекс вершины public:

stack(); // конструктор

void push (char ch) ; // помещает в стек символ

char pop () ; // выталкивает символ из

stack::stack()

<

cout « - "Работа конструктора стека\л";

tos = 0;

// Помещение символа в стек void stack::push(char ch)

{

if (tos==SIZE) {

cout « "Стек полон \п"; return; }

stck [tos] = ch; tos+-(-; I

3, изучение классов _

.11 Выталкивание символа из стека char stack: :pop ()
1   ...   5   6   7   8   9   10   11   12   ...   32

Похожие:

Для программистов и опытных пользователей icon П равила пользования услугами информационно-библиотечного центра
Правила пользования услугами информационно-библиотечного центра – документ, фиксирующий взаимоотношения пользователя с информационно-библиотечным...
Для программистов и опытных пользователей icon Ханк Рейнвотер Как пасти котов. Наставление для программистов, руководящих...
Посвящается Дэвиду, моему любимому сыну, память о тебе меня неизменно вдохновляет
Для программистов и опытных пользователей icon Дипломная работа
Степень удовлетворенности пользователей в документах по музыкальному искусству 25
Для программистов и опытных пользователей icon Задача учителя-методиста в современной школе научить созданию новых...
Созданы педагогические папки-копилки таких учителей как Ухмусултанова А. С., Нурмагомедова Н. Д., Яшувова А. М., Карамурзаева Б....
Для программистов и опытных пользователей icon Форм массовой работы
Традиционные и инновационные, серьезные и игровые формы массового формирования информационной культуры пользователей
Для программистов и опытных пользователей icon «Поддержка дистанционных олимпиад: новые идеи и технологии»
В данных тезисах рассматривается вопрос быстрого и удобного создания сайтов олимпиад с помощью типового сайта поддержки олимпиад,...
Для программистов и опытных пользователей icon Флот в первой половине XIX века Император Павел I и военно-морские силы
Поэтому флот России, пользовавшийся в конце XVIII века заслуженной славой и состоявший из опытных и смелых моряков, вместе с тем...
Для программистов и опытных пользователей icon Приказ №50/3 от 30. 08. 2013г. Анализ работы библиотеки мкоу «Трусовская...
В библиотеке образовательного учреждения художественной литературы насчитывается 3703 экземпляра, учебной 1588, электронных изданий...
Для программистов и опытных пользователей icon Реферат Дипломный проект посвящен модернизации локальной сети организации «Надежный Контакт»
Проанализирован список задач решаемых с помощью локальной сети; также были изучены аппаратные и программные средства, необходимые...
Для программистов и опытных пользователей icon Курсовая работа студента 342 группы Матвеева Н. Н. «Реализация отмены/повтора...
Средств разработчиков и проектировщиков по можно отдельно выделить так называемые case-средства (case computer-Aided Software Engineering)....
Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции