Программирование >>  Инициализация объектов класса, структура 

1 ... 59 60 61 [ 62 ] 63 64 65 ... 395


#include <fstream> #include <string> #include <vector> int main() {

string fileName; #1

cout << Введите имя файла: ; cin >> fileName;

if ( fileName.empty() ) {

странн случай

cerr << Пустое имя файла. Завершение работы.\n ; return -1;

ifstream inFile( fileName.c str() ); #2 if ( ! inFile ) {

cerr << Невозможно открыть файл.\n ; return -2;

string inBuf; #3

vector< string > text; #4 while ( inFile >> inBuf ) {

for ( int ix = 0; ix < inBuf .size(); ++ix ) #5 можно обойтись без ch,

но использовав его для илстрации if (( char ch = inBuf[ix] )==.){ #6 ch =

inBuf[ix] = ch;

text.push back( inBuf );

if ( text.empty() ) return 0;

определяющая сразу два объекта

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

tor<string>::iterator iter

iend = text.end();

vector<string>::iterator iter = text.begin(), #7

п in - ** in ! \ .

while ( iter != -iend ) { cout << *iter << \n; ++iter;

return 0;

Программа содержит семь инструкций объявления и восемь определений объектов. Объявления действуют локально; неременная объявляется непосредственно перед первым использованием объекта.

В 70-е год1 философия программирования уделяла особое внимание тому, чтобы определения всех объектов находились в начале программы или блока, перед исполняемыми инструкциями. (В С, например, определение переменной не является инструкцией и обязано располагаться в начале блока.) В некотором смысле это была реакция на идиому использования переменных без предварительного объявления, чреватую ошибками. Такую идиому поддерживал, например, FORTRAN.



одна инструкция объявления, определяющая сразу два объекта vector<string>::iterator

tring>::iterator iter = text.begin(),

нашей программе мы определяем два итератора вектора в одной инструкции:

lend = text.end();

vector<string>::iterator iter = text.begin();

Эквивалентная пара, определяющая по одному объекту, выглядит так:

vector<string>::iterator lend = text.end();

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

то хотел опредеть программист?

идентификатором (используемые имена переменных наводят на второе предположение):

string *ptrl, ptr2;

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

Необходимо ли это? Для встроенных типов данных применение локальных объявлений является скорее вопросом вкуса. Язык их поощряет , разрешая объявлять переменные внутри условных частей инструкций if, if-else, switch, while, for. Те программисты, которые любят этот стиль, верят, что таким образом делают свои программы более понятными.

Локальные объявления становятся необходимостью, когда м1 используем объекты классов, имеющие конструкторы и деструкторы. Если мы помещаем все объявления в начало блока или функции, происходят две неприятные вещи:

конструкторы всех объектов вызываются перед исполнением первой инструкции блока. Применение локальн1х объявлений позволяет размазать расходе! на инициализацию по всему блоку;

что более важно, блок или функция могут завершиться до того, как будут действительно использованы все объявленные в начале объекты. Скажем, наша программа из предыдущего примера имеет два аварийных выхода: при вводе пользователем пустого имени файла и при невозможности открыть файл с заданным именем. При этом последующие инструкции функции уже не выполняются. Если бы объекты inBuf и next были объявлены в начале блока, конструкторы и деструкторы этих объектов в случае ненормального завершения функции вызывались бы совершенно напрасно.

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



string *ptr1;

Эквивалентная пара инструкций не позволит допустить такую ошибку:

string *ptr2;

В наших примерах мы обычно группируем определения объектов в инструкции по

int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;

сходству употребления. Например, в следующей паре

int charCnt=0, wordCnt=0;

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

Упражнение 5.1

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

Упражнение 5.2

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

5.3. Инструкция if

Инструкция if обеспечивает выполнение или пропуск инструкции или блока в

if ( условие )

зависимости от условия. Ее синтаксис таков:

инструкция

условие заключается в круглые скобки. Оно может быть выражением, как в этом примере:

if(a+b>c) { ... }

или инструкцией объявления с инициализацией:

if ( int ival = compute value() ){... }



1 ... 59 60 61 [ 62 ] 63 64 65 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика