Бьерн Страуструп (Стpаустpуп - Книга о C++), страница 10

2013-09-15СтудИзба

Описание файла

Документ из архива "Стpаустpуп - Книга о C++", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика" в общих файлах.

Онлайн просмотр документа "Бьерн Страуструп"

Текст 10 страницы из документа "Бьерн Страуструп"

данных и объектно-ориентированное программирование. При этом он должен

быть пригодным для большинства основных задач системного программирования.

Основная трудность для языка, который создавался в расчете на методы

упрятывания данных, абстракции данных и объектно-ориентированного

программирования, в том, что для того, чтобы быть языком общего

назначения, он должен:

- идти на традиционных машинах;

- сосуществовать с традиционными операционными системами и языками;

- соперничать с традиционными языками программирования в эффективности

выполнения программы;

- быть пригодным во всех основных областях приложения.

Это значит, что должны быть возможности для эффективных числовых

операций (арифметика с плавающей точкой без особых накладных расходов,

иначе пользователь предпочтет Фортран) и средства такого доступа к памяти,

который позволит писать на этом языке драйверы устройств. Кроме того, надо

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

обращений в традиционных операционных системах. Наконец, должна быть

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

программирование, вызывать функции, написанные на других языках, а из

других языков вызывать функцию на этом языке, поддерживающем

объектно-ориентированное программирование.

Далее, нельзя рассчитывать на широкое использование искомого языка

программирования как языка общего назначения, если реализация его целиком

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

архитектурой.

Если не вводить в язык возможности низкого уровня, то придется для

основных задач большинства областей приложения использовать некоторые

языки низкого уровня, например С или ассемблер. Но С++ проектировался с

расчетом, что в нем можно сделать все, что допустимо на С, причем без

увеличения времени выполнения. Вообще, С++ проектировался, исходя из

принципа, что не должно возникать никаких дополнительных затрат времени и

памяти, если только этого явно не пожелает сам программист.

Язык проектировался в расчете на современные методы трансляции,

которые обеспечивают проверку согласованности программы, ее эффективность

и компактность представления. Основным средством борьбы со сложностью

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

Особенно это касается больших программ, создаваемых многими людьми.

Пользователь может не являться одним из создателей таких программ, и может

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

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

программистами, последнее замечание можно отнести практически ко всем

программам.

С++ проектировался для поддержки того принципа, что всякая программа

есть модель некоторых существующих в реальности понятий, а класс является

конкретным представлением понятия, взятого из области приложения ($$12.2).

Поэтому классы пронизывают всю программу на С++, и налагаются жесткие

требования на гибкость понятия класса, компактность объектов класса и

эффективность их использования. Если работать с классами будет неудобно

или слишком накладно, то они просто не будут использоваться, и программы

выродятся в программы на "лучшем С". Значит пользователь не сумеет

насладиться теми возможностями, ради которых, собственно, и создавался

язык.

* ГЛАВА 2. ОПИСАНИЯ И КОНСТАНТЫ

"Совершенство достижимо только в момент

краха".

(С.Н. Паркинсон)

В данной главе описаны основные типы (char, int, float и т.д.) и

способы построения на их основе новых типов (функций, векторов, указателей

и т.д.). Описание вводит в программу имя, указав его тип и, возможно,

начальное значение. В этой главе вводятся такие понятия, как описание и

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

Даются обозначения литеральных констант С++ и способы задания

символических констант. Приводятся примеры, которые просто

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

возможности выражений и операторов языка С++, будут приведены в следующей

главе. В этой главе лишь упоминаются средства для определения

пользовательских типов и операций над ними. Они обсуждаются в главах 5 и 7.

2.1 ОПИСАНИЯ

Имя (идентификатор) следует описать прежде, чем оно будет использоваться

в программе на С++. Это означает, что нужно указать его тип, чтобы

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

несколько примеров, иллюстрирующих все разнообразие описаний:

char ch;

int count = 1;

char* name = "Njal";

struct complex { float re, im; };

complex cvar;

extern complex sqrt(complex);

extern int error_number;

typedef complex point;

float real(complex* p) { return p->re; };

const double pi = 3.1415926535897932385;

struct user;

template<class T> abs(T a) { return a<0 ? -a : a; }

enum beer { Carlsberg, Tuborg, Thor };

Из этих примеров видно, что роль описаний не сводится лишь к привязке

типа к имени. Большинство указанных описаний одновременно являются

определениями, т.е. они создают объект, на который ссылается имя.

Для ch, count, name и cvar таким объектом является элемент памяти

соответствующего размера. Этот элемент будет использоваться как

переменная, и говорят, что для него отведена память. Для real подобным

объектом будет заданная функция.

Для константы pi объектом будет число 3.1415926535897932385.

Для complex объектом будет новый тип. Для point объектом является

тип complex, поэтому point становится синонимом complex. Следующие

описания уже не являются определениями:

extern complex sqrt(complex);

extern int error_number;

struct user;

Это означает, что объекты, введенные ими, должны быть определены

где-то в другом месте программы. Тело функции sqrt должно быть указано

в каком-то другом описании. Память для переменной error_number типа

int должна выделяться в результате другого описания error_number.

Должно быть и какое-то другое описание типа user, из которого можно

понять, что это за тип. В программе на языке С++ должно быть только

одно определение каждого имени, но описаний может быть много. Однако все

описания должны быть согласованы по типу вводимого в них объекта.

Поэтому в приведенном ниже фрагменте содержатся две ошибки:

int count;

int count; // ошибка: переопределение

extern int error_number;

extern short error_number; // ошибка: несоответствие типов

Зато в следующем фрагменте нет ни одной ошибки (об использовании

extern см. #4.2):

extern int error_number;

extern int error_number;

В некоторых описаниях указываются "значения" объектов, которые они

определяют:

struct complex { float re, im; };

typedef complex point;

float real(complex* p) { return p->re };

const double pi = 3.1415926535897932385;

Для типов, функций и констант "значение" остается неизменным;

для данных, не являющихся константами, начальное значение может

впоследствии изменяться:

int count = 1;

char* name = "Bjarne";

//...

count = 2;

name = "Marian";

Из всех определений только следующее не задает значения:

char ch;

Всякое описание, которое задает значение, является определением.

2.1.1 Область видимости

Описанием определяется область видимости имени. Это значит, что

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

Если имя описано в функции (обычно его называют "локальным именем"), то

область видимости имени простирается от точки описания

до конца блока, в котором появилось это описание. Если имя не находится

в описании функции или класса (его обычно называют "глобальным именем"),

то область видимости простирается от точки описания до конца файла,

в котором появилось это описание.

Описание имени в блоке может скрывать описание в объемлющем блоке или

глобальное имя; т.е. имя может быть переопределено так, что оно будет

обозначать другой объект внутри блока. После выхода из блока прежнее

значение имени (если оно было) восстанавливается. Приведем пример:

int x; // глобальное x

void f()

{

int x; // локальное x скрывает глобальное x

x = 1; // присвоить локальному x

{

int x; // скрывает первое локальное x

x = 2; // присвоить второму локальному x

}

x = 3; // присвоить первому локальному x

}

int* p = &x; // взять адрес глобального x

В больших программах не избежать переопределения имен. К сожалению,

человек легко может проглядеть такое переопределение. Возникающие

из-за этого ошибки найти непросто, возможно потому, что они

достаточно редки. Следовательно, переопределение имен следует

свести к минимуму. Если вы обозначаете глобальные переменные или

локальные переменные в большой функции такими именами, как i или x,

то сами напрашиваетесь на неприятности.

Есть возможность с помощью операции разрешения области видимости

:: обратиться к скрытому глобальному имени, например:

int x;

void f2()

{

int x = 1; // скрывает глобальное x

::x = 2; // присваивание глобальному x

}

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

Область видимости имени начинается в точке его описания (по

окончании описателя, но еще до начала инициализатора - см. $$R.3.2). Это

означает, что имя можно использовать даже до того, как задано его

начальное значение. Например:

int x;

void f3()

{

int x = x; // ошибочное присваивание

}

Такое присваивание недопустимо и лишено смысла. Если вы попытаетесь

транслировать эту программу, то получите предупреждение: "использование

до задания значения". Вместе с тем, не применяя оператора ::, можно

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

блока. Например:

int x = 11;

void f4() // извращенный пример

{

int y = x; // глобальное x

int x = 22;

y = x; // локальное x

}

Переменная y инициализируется значением глобального x, т.е. 11,

а затем ей присваивается значение локальной переменной x, т.е. 22.

Имена формальных параметров функции считаются описанными в самом

большом блоке функции, поэтому в описании ниже есть ошибка:

void f5(int x)

{

int x; // ошибка

}

Здесь x определено дважды в одной и той же области видимости.

Это хотя и не слишком редкая, но довольно тонкая ошибка.

2.1.2 Объекты и адреса

Можно выделять память для "переменных", не имеющих имен, и

использовать эти переменные.

Возможно даже присваивание таким странно выглядящим "переменным",

например, *p[a+10]=7. Следовательно, есть потребность именовать

"нечто хранящееся в памяти". Можно привести подходящую цитату из

справочного руководства: "Любой объект - это некоторая область

памяти, а адресом называется выражение, ссылающееся на объект или

функцию" ($$R.3.7). Слову адрес (lvalue - left value, т.е. величина

слева) первоначально приписывался смысл "нечто, что может в

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

(см. $$2.5). Адрес, который не был описан со спецификацией const,

называется изменяемым адресом.

2.1.3 Время жизни объектов

Если только программист не вмешается явно, объект будет создан при

появлении его определения и уничтожен, когда исчезнет из

области видимости. Объекты с глобальными именами создаются,

инициализируются (причем только один раз) и существуют до конца

программы. Если локальные объекты описаны со служебным словом

static, то они также существуют до конца программы. Инициализация их

происходит, когда в первый раз управление "проходит через"

описание этих объектов, например:

int a = 1;

void f()

{

int b = 1; // инициализируется при каждом вызове f()

static int c = a; // инициализируется только один раз

cout << " a = " << a++

<< " b = " << b++

<< " c = " << c++ << '\n';

}

int main()

{

while (a < 4) f();

}

Здесь программа выдаст такой результат:

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
429
Средний доход
с одного платного файла
Обучение Подробнее