Краткие сведения о языке C++
Краткие сведения о языке C++
Комментарии
Чаще всего освоение нового языка начинается с комментариев. Оставлять в коде пометки, по которым можно проследить ход ваших мыслей, не только является хорошим тоном по отношению к другим разработчиком, но и позволяет облегчить дальнейшую работу с кодом. Чаще всего, если фрагмент кода никак не удается коротко прокомментировать, это свидетельствует о том, что блок кода стоит переписать заново.
Однострочные комментарии создаются при помощи двух символов наклонной черты.
// Это строка комментария
В следующем примере показано, как создаются многострочные комментарии.
/* Все эти строки являются комментариями
и должны быть обязательно
закрыты сочетанием звездочки и косой черты */В комментариях можно использовать весь набор символов. В тексте программы лучше пользоваться только символьным набором ASCII. В коде программы комментариями были помечены логические блоки кода, чтобы было легче на них ссылаться из текста этой главы.
Чтобы посмотреть, как выглядит набор символов ASCII, необходимо продолжить работу над примером.
Упражнение 4.1 (продолжение)
8. В файле MyExp.cpp в конце блока 3 дописать еще одно объявление переменной (массива):wchar_t mstr[256];
9. В конец файла дописать еще один блок, код которого приведен в листинге 4.3. Листинг 4.3
// Блок 13
void f1(){
mstr[0]=;
for (unsigned short i = 22; i<127; i++){
mstr[i-21]=i;
}
}10. Изменить код блока 11, как показано в листинге 4.4. Листинг 4.4.
case 49: {
f1();
szStr = mstr;}
break;11. В файле MyExp.h дописать объявление функции в конец блока 4.
void f1();
12. Запустить программу. После нажатия клавиши 1 на экран будет выведена таблица ASCII, а точнее, та ее часть, которая может быть отображена на экране.
Лексемы
Существует шесть классов лексем. К этим базовым единицам языка относятся идентификаторы, ключевые слова, константы, строки, операторы и прочие разделители. Символы пробела, табуляции и новой строки, а также комментарии игнорируются, за исключением тех случаев, когда они служат разделителями лексем.
Типы и объявления, инициализация
Для того чтобы программа заработала на устройстве, текст программы должен быть превращен в исполняемый код. Трансляцией текста программы в исполняемый код занимается специальная программа – компилятор. Но компилятор работает по определенным правилам. Нельзя просто передать ему для компиляции некий блок кода, например, x=y+f(2);. В этом случае компилятор собщит, что он не знает, что такое х, у и f, поэтому придется предпринять некоторые действия, чтобы сообщить компилятору, что это за переменные и что для них имеют смысл действия присваивания, сложения и вызова функции. Каждое имя некоторого объекта (идентификатор) в C++ имеет связанный с этим именем тип. Тип показывает компилятору, какие операции можно применять к имени и как эти операции нужно интерпретировать.
Поэтому пример можно сделать более понятным для компилятора, написав небольшой дополнительный фрагмент кода:float x;
int y;
float f(int);В этих строках содержатся сведения, необходимые для того, чтобы компилятор смог понять пример. Правда, скомпилировать программу по-прежнему не удастся, поскольку компилятор еще не знает, как выполнять функцию f. Эта функция уже объявлена, но необходимо еще описать, как функция должна распорядится переданным ей параметром типа int и в результате каких операций должно быть возвращено значение типа float.
Кроме обязательного объявления всех именованных объектов, их еще необходимо инициализировать, то есть присвоить им начальное значение. Некоторые объекты инициализируются при создании, некоторые – нет. Не нужно инициализировать переменные и объекты, объявленные внутри функций. В результате этого неинициализированные объекты могут иметь неопределенное значение. Это неопределенное значение при его случайном использовании может дать непредсказуемый результат.
Можно объявлять несколько имен в одном операторе объявления. Следующая строка кода иллюстрирует эту возможность:int х, у, z;
В С++ при объявлении обязательно должен указываться тип. Основные типы, применяемые в C++, перечислены в следующем списке.
? Логический тип (bool).
? Символьный тип (char, wcharjt).
? Целые типы (short, int, long).
? Типы с плавающей точкой (float, double).
? Перечислимые типы (enum).
? Тип void используется для указания на отсутствие информации.
? Указатели.
? Массивы.
? Ссылки.
? Структуры данных и классы.
В файле MyExp.cpp роазмещены несколько объявлений. Например, в блоке 3 присутствует следующий фрагмент кода:wchar_t *szStr; // объявлена переменная szStr,
//которая является указателем (*) на тип wchar_t
wchar_t mstr[256]; // объявлен массив mstr элементов типа wchar_t
//с количеством элементов 256В блоке 4 помимо объявлений используется и инициализация переменных:
MSG msg; //объявлена переменная msg типа MSG
int rc = 0; // объявлена переменная rc с типом int,
// переменная была инициализирована значением 0
Базовые (фундаментальные) типы
Логический типПеременные этого типа могут принимать значение истина(true) или ложь(false). Эти переменные применяются для анализа выполнения некоторого условия. По результатам проверки условия то или иное действие будет или не будет выполнено. Логическим значениям false и true соответствуют целочисленные значения 0 и 1. Логические значения могут принимать участие в арифметических операциях, но при присвоении им целочисленных значений, они будут усекаться до нуля или единицы. Это иллюстрируется в рассматриваемом примере.
Упражнение 4.1 (продолжение)
13. В файле MyExp.h следует добавить в конец блока 4 объявление функцииvoid f2();.
14. В файле MyExp.сpp следует добавить в конец блока 3 объявления символьных массивов:
char mm[256]; charnn[32];
15. В конец файла MyExp.сpp нужно добавить блок 14, с кодом, который показан в листинге 4.5. Листинг 4.5
// Блок 14
void f2(){
bool i = false;
int j = 10;
mm[0] = ;
sprintf(nn, «%d», j);
strcat(mm, " j = ");
strcat(mm, nn);
strcat(mm, « »);
i=7;
sprintf(nn, «%d», i);
strcat(mm, " i = ");
strcat(mm, nn);
strcat(mm, « »);
j = j+i;
sprintf(nn, «%d», j);
strcat(mm, " j+i = ");
strcat(mm, nn);
strcat(mm, « »);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}16. Изменить вторую по счету ветвь case в блоке 11, как показано в листинге 4.6. Листинг 4.6
case 50: {
f2();
}
break;ПРИМЕЧАНИЕ. Каждый новый фрагмент кода будет добавляться в новые ветви case оператора выбора switch.
Теперь можно запустить программу. Нажатие клавиши 2 на клавиатуре приведет к появлению в окне последовательности изменения значений переменных. Как и ожидалось, присвоение целочисленной переменной j значения 10 прошло без проблем. А вот присвоение значения 7 переменной i типа bool усекло значение 7 до единицы, и при сложении i и j результат получился равным 11, а не 17. Символьный тип
В переменной типа char может храниться один из символов, входящих в набор символов используемой реализации ОС. Для хранения символа отводится 8 бит, так что всего можно использовать 256 значений этого типа. Можно с достаточной уверенностью предположить, что в набор символов конкретной реализации входят цифры, 26 букв английского алфавита и некоторые основные знаки пунктуации. Все остальные предположения о составе символьного набора не могут считаться достоверными.
Каждая символьная константа имеет числовое значение, отображающее ее порядковый номер в символьном наборе. Тип char может быть как знаковым (signed char), так и беззнаковым (unsigned char). По умолчанию char трактуется как знаковый тип, поэтому если нужно получить беззнаковое преобразование, необходимо явно объявлять переменную типа unsigned char.
Для хранения символов больших наборов, таких как Unicode, используется тип wchar_t.
Символьные типы являются интегральными. Как и к логическим типам, к ним можно применять арифметические и логические операции. Кроме того, имеется ряд символьных констант, называющихся ESC-последовательностями, играющих особые роли при работе с символьными строками. Основные ESC-последовательности приведены в следующем списке.
' ' – новая строка,
' ' – горизонтальная табуляция,
'v' – вертикальная табуляция,
' ' – перевод каретки,
'f' – перевод страницы,
'a' – звуковой сигнал,
' – одиночная кавычка (апостроф),
'" – двойная кавычка,
'\ – обратная косая черта.
Целые типыК целочисленным типам относятся int, short int и long int. Вместо двух последних можно применять обозначения short и long. Кроме того, целочисленный тип может быть знаковым и беззнаковым – signed и unsigned. Обычный тип int всегда является знаковым. Если нужно получить беззнаковый тип, следует явно объявить переменную как unsigned. Объявление unsigned равнозначно объявлению unsigned int. Конкретное значение размеров переменной зависит от реализации ОС.
Типы с плавающей точкойЭти типы представлены тремя размерами – float (одинарная точность), double (двойная точность) и long double (расширенная точность). Конкретное значение размеров переменных зависит от реализации ОС.
РазмерыРазмер переменных базовых типов в С++ зависит от реализации ОС. Размеры объектов выражаются в единицах размера char. Исходя из предположения, что переменные типа char занимают один байт, размеры любых других объектов в байтах можно определить при помощи оператора sizeof, как это показано в тестовом примере.
Упражнение 4.1 (продолжение)
17. Объявить в файле MyExp.h функцию f3() и дописать в блок 11 еще одну ветвь case, код которой приведен в листинге 4.7.
Листинг 4.7case 51: {
f3();
}
break;18. Добавить в конец файла MyExp.cpp еще один блок, код которого приведен в листинге 4.8. Листинг 4.8
// Блок 15
void f3(){
mm[0] = ;
sprintf(nn, «%d», (sizeof(char)));
strcat(mm, " Size of type char = ");
strcat(mm, nn);
strcat(mm, « »);
sprintf(nn, «%d», (sizeof(wchar_t)));
strcat(mm, " Size of type wchar_t = ");
strcat(mm, nn);
strcat(mm, « »);
sprintf(nn, «%d», (sizeof «Hello, Word!»));
strcat(mm, « Size of string »Hello, Word!" = ");
strcat(mm, nn);
strcat(mm, « »);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}
Результат работы этого блока выводится на экран при нажатии клавиши 3.
ЛитералыЛитералы – это символьные значения переменных и констант, которые записываются в тексте программы. Для типа bool литералами будут выражения true и false, для типа char литералом будет символ, заключенный в одинарные кавычки.
Литералы для целых чисел различаются по системе счисления и могут иметь десятеричную, восьмеричную и шестнадцатеричную форму записи. Десятеричная форма записи выглядит наиболее привычно. И в качестве литералов используются обычные числа. Восьмеричный литерал обязательно начинается с нуля – 00, 02, 077. Шестнадцатеричный литерал начинается с префикса Ох – 0x0, 0x2, 0x3f.
Для явной записи беззнаковых литералов можно использовать суффикс U – 23U, а суффикс L можно использовать для явной записи литерала типа long – 23L. Рекомендуется для записи числовых значений использовать десятеричные литералы, а восьмеричные и шестнадцатеричные литералы применять для записи цепочек битов.
Для записи значений с плавающей точкой используются следующие формы:
? 1.23
? 23
? 0.23
? 1.
? 1.0
? 1.2e10
? 1.23e-10
В записи литералов с плавающей точкой не должно быть пробелов. По умолчанию, литералы с плавающей точкой имеют значение типа double. Если необходимо определить литерал типа float, это можно сделать при помощи суффикса f – 2.9999f.
Void Это фундаментальный тип, который никогда не используется самостоятельно. Не бывает объектов типа void. Этот тип указывает на то, что другой тип, в сочетании с которым он используется, не имеет значения, имеет неопределенное значение или неизвестное значение. В следующем фрагменте кода приводятся примеры применения этого фундаментального типа.void f(); //эта функция не возвращает значение
void* pnt; //это указатель на объект неизвестного типа
void х; //эта запись неверна, объектов типа void не существует
Перечисления При помощи перечислений устанавливается некоторый набор значений, определяемых пользователем. Перечисление объявляется при помощи ключевого слова enum. В качестве элементов перечисления можно определить именованные целые константы:enum {DEC, JAN, FEB};
В этом случае определены три целые константы. Если константы не инициализируются явно, то по умолчанию им присваиваются значения, начинающиеся с нуля и увеличивающиеся на единицу для каждой следующей константы. Таким образом значение DEC будет равно 0, JAN – 1, а FEB – 2. Перечислению можно присвоить имя, как это показано в следующем фрагменте:
enum year{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};
Константы в перечислении можно инициализировать значениями, отличными от индексных, которые присваиваются по умолчанию:
enum times{SAVE=10,SLEEP=20,STOP=30};
Если инициализируется только часть элементов перечисления, то те элементы перечисления, которые указаны после инициализированных, будут получать возрастающие значения, отсчитываемые от того значения, которое они получили при инициализации. В следующем фрагменте элемент STOP будет инициализирован значением 21.
enum times{SAVE=10,SLEEP=20,STOP};
Данный текст является ознакомительным фрагментом.