2013 10 01_lecture_04
description
Transcript of 2013 10 01_lecture_04
Лекция 4. Встроенные типы,
инструкции и операторы.
С++ Basics. Valery Lesin, 2013 1
Встроенные типы
С++ Basics. Valery Lesin, 2013 2
Группа Тип Литералы
Логический bool true, false
Символьный char, wchar_t ‘a’, ‘\n’, ‘\t’, L’xy’
Целый int 0, 5, 0xef, 045
short [int] 32767
long [int] 56L, -1234567L
unsigned [int] 765u
Вещественный long double 6.626e-34L
double 2.71, .56, 2., 6e24
float 3.1415f
Размеры типов
С++ Basics. Valery Lesin, 2013 3
12345
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)1 <= sizeof(bool) <= sizeof(long)sizeof(char) <= sizeof(wchar_t) <= sizeof(long)sizeof(float)<= sizeof(double) <= sizeof(long double)sizeof(T) == sizeof(signed T)== sizeof(unsigned T)
• Ограничения типа: std::numeric_limits<type>
• Не полагайтесь на размер, для этого есть
uint16_t, int64_t и т.д.
Явное приведение типов• Базовые типы неявно приводятся друг у другу.
Многие с потерей значимости (warning).
С++ Basics. Valery Lesin, 2013 4
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
float* pfv; const int* piv; short sv;
int* a = (int*)pfv; // 1. C-stylechar b(sv); // 2. constructor
double pi = 3.1415;int ipi = static_cast<int>(pi); //---int* c = reinterpret_cast<int*>(pfv); //---int* d = const_cast<int*>(piv);//---derived* d = dynamic_cast<derived*>(base);
Тип void
• Указатель на void:
С++ Basics. Valery Lesin, 2013 5
1.2.3.4.5.
void *p = 0, *q = 0;bool eq = (p == q);void do_smth(int value);int main (void); // C-stylevoid nothing; // wrong!
1.2.3.4.5.6.7.8.9.10.
void send(const void* data, size_t size);//...X* ptr = ...;send(ptr, sizeof(X));//-------------------------------------------void receive_X(const void* data, size_t size){
Assert(size == sizeof(X));X const* ptr = static_cast<X const*>(data);
}
null terminated strings
• Одинаковые литералы могут размещаться в одном месте
• Спец. символы: ‘\t’ ‘\r’ ‘\n’ ‘\a’
С++ Basics. Valery Lesin, 2013 6
1.2.3.4.5.6.7.
const char str [] = "Hello"; // native typechar can_edit[] = "can change this string";char* c_style = "old style string"; // don't change it
const char ml [] = "this is""multiline\string";
null terminated string std::string
char* a = “…”, *b = “…”; string a = “…”, b = “…”;
strcmp(a, b) == 0; a == b;
strcpy(a,b); a = b;
Перечисления enum
• Нет неявного приведения из целого типа
• Пользовательский тип - можно, например, переопределить операторы
С++ Basics. Valery Lesin, 2013 7
1.
2.
3.
4.
5.
6.
enum msg_type{
mt_setup,mt_request = 0x10,mt_response
};
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int process_msg(msg_type type, const void* data){
switch(type){case mi_setup : return process_setup (*static_cast<setup *>(data));case mi_request : return process_request (*static_cast<request *>(data));case mi_response: return process_response(*static_cast<response*>(data));default: throw std::runtime_error("unknown message");}
} // hidden error! where?
Синоним имени typedef
• Задает синоним имени, не задает новый тип
• Делает код короче – проще читать
• Платформонезависимые типы
• «Протаскивает» тип через шаблон
• Имеет внутреннюю компоновку
С++ Basics. Valery Lesin, 2013 8
1.
2.
3.
typedefstd::map<std::string, student> students_t;
И еще раз про объявления
• Идентификаторы: буквы, цифры, _ (начало не с цифры). Длина не ограничена стандартом, но часто реализацией
• Объявление через запятую – остается только базовый тип (не делайте так!):
С++ Basics. Valery Lesin, 2013 9
Необязательный
спецификатор (e.g.
extern, virtual)
Базовый тип Объявляющая
часть
Необязательный
инициализатор
--- const char array[] = “Hello, World!”
1.2.
int* x, y = 1, *const z = 0; // int* x; int y = 1; int *const z = 0;
Области действия и видимости
С++ Basics. Valery Lesin, 2013 10
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.
int uno; // = 0
void foobar(){
int due; // = 'trash‘int& quatro = due;
int uno = 1;::uno = 2; // uno != ::uno
if (true){
double due = 8.31;T tre = func(&tre);quatro = 2; // due <line 5> == 2
}}
Структуры struct
С++ Basics. Valery Lesin, 2013 11
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.
struct student{
string name;double av_score;
};
student peter = {"Peter", 4.68};student* paul = new student;
paul->name = "Paul";paul->av_score = 3.96;
struct size_test{
short mem1;bool mem2;int mem4;
};
sizeof(size_test) == 8; // not 7, at least on my computer
Структуры struct, часть 2
С++ Basics. Valery Lesin, 2013 12
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.
struct list;struct node{
list* owner; // correctnode* next ; // correctT data ;
};
// declarationsextern list my_list;list make_list();void sort_list(list&);
// definitionslist wrong; list* ok; make_list(); // wrong, need sizesort_list(wrong); // hmm, wrong?
// equivalence// Эти структуры задают разные типыstruct my_class {int x; int y;};struct your_class{int x; int y;};
Операторы
С++ Basics. Valery Lesin, 2013 13
Семантика Синтаксис
Область видимости [namespace|class]::name
Выбор члена object.memberptr->member
Доступ по индексу pointer[]
Вызов функции expr(expr-list)
Постфиксный инкремент lvalue++
Идентификатор типа typeid({expr|type})
Преобразование типов static_cast<type>(expr)
Взятие размера sizeof({expr|type})
Унарные префиксные операторы ~lvalue
Разыменование *expr
Выделение/освобождение памяти new type (expr-list)
Операторы, часть 2
С++ Basics. Valery Lesin, 2013 14
Семантика Синтаксис
Бинарные арифметические операторы expr * expr
Сдвиги expr << expr
Бинарные операторы сравнения expr < expr
Бинарные логические операторы expr || expr
Условное выражение expr ? expr : expr
Присваивания expr = expr
expr <<= expr
expr += expr
Генерация исключения throw expr
Запятая expr, expr
Выражения
• Результат:
– Расширение к большему (например, *)
– Логическое выражение bool
– Там, где можно, lvalue (a=b=c)
• Порядок вычисления в общем случае не определен
• Исключение: ленивое вычисление && и || на встроенных типах
С++ Basics. Valery Lesin, 2013 15
1.2.3.4.
f(a) + f(b)// what would you get here?if (var & mask == 0){...}if (0<=x<=99) {...}
Инкремент/Декремент
• Префиксный: изменил, вернул новое значение
• Постфиксный: изменил, вернул старое значение
С++ Basics. Valery Lesin, 2013 16
1.2.3.4.5.6.7.8.9.
int a = ++x;int b = x += 1;
int c = x++;int t;int d = (t = x, x += 1, t);
// prefer prefix ++for (auto it = cont.begin(); it != cont.end(); ++it);
Инструкция (statement) выбора
С++ Basics. Valery Lesin, 2013 17
1.2.3.4.5.
if (ptr p = get_pointer(...))if (connected(p))
disconnect(p);else
connect (p);
1.2.3.4.5.6.7.8.9.10.11.12.13.
switch(id){btn_yes:
apply_changes();btn_no :
close_doc ();break;
btn_cancel:continue_editing();break;
default:Log("Unexpected btn " << id);
}
• switch– окончание ветки: break, return, throw, exit(0)
– для определения переменных потребуются скобки {}
Циклы
• Управление циклом:
– досрочный выход: break, return, throw, exit(0)
– продолжение: continue
С++ Basics. Valery Lesin, 2013 18
1.2.3.4.5.6.7.8.9.10.
for (init; condition; modification) {}while(condition) {}do{} while(condition)
// examplesfor (size_t i = 0, size = strlen(src); i < size; ++i)
dest[i] = src[i];
while(*dest++ = *src++); // don't do this
Комментарии
• Лучше вообще без комментариев, чем нерелевантные комментарии
• Если можно выразить кодом, не пишите комментарии
• Сложный алгоритм – дай ссылку на статью
• Желательно написать: – сложный код (например, оптимизация)
– а-ля разметка (окончание namespace)
– в заголовке файла (зачем он, copyright)
С++ Basics. Valery Lesin, 2013 19
1.2.3.
// one line /* multi
line */
Вопросы?
С++ Basics. Valery Lesin, 2013 20