2013 10 01_lecture_04

3,056 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,056
On SlideShare
0
From Embeds
0
Number of Embeds
2,732
Actions
Shares
0
Downloads
19
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2013 10 01_lecture_04

  1. 1. Лекция 4. Встроенные типы, инструкции и операторы. С++ Basics. Valery Lesin, 2013 1
  2. 2. Встроенные типы С++ 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
  3. 3. Размеры типов С++ Basics. Valery Lesin, 2013 3 1 2 3 4 5 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 и т.д.
  4. 4. Явное приведение типов • Базовые типы неявно приводятся друг у другу. Многие с потерей значимости (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-style char 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);
  5. 5. Тип 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-style void 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); }
  6. 6. null terminated strings • Одинаковые литералы могут размещаться в одном месте • Спец. символы: ‘t’ ‘r’ ‘n’ ‘a’ С++ Basics. Valery Lesin, 2013 6 1. 2. 3. 4. 5. 6. 7. const char str [] = "Hello"; // native type char 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;
  7. 7. Перечисления 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?
  8. 8. Синоним имени typedef • Задает синоним имени, не задает новый тип • Делает код короче – проще читать • Платформонезависимые типы • «Протаскивает» тип через шаблон • Имеет внутреннюю компоновку С++ Basics. Valery Lesin, 2013 8 1. 2. 3. typedef std::map<std::string, student> students_t;
  9. 9. И еще раз про объявления • Идентификаторы: буквы, цифры, _ (начало не с цифры). Длина не ограничена стандартом, но часто реализацией • Объявление через запятую – остается только базовый тип (не делайте так!): С++ 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;
  10. 10. Области действия и видимости С++ 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 } }
  11. 11. Структуры 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
  12. 12. Структуры 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; // correct node* next ; // correct T data ; }; // declarations extern list my_list; list make_list(); void sort_list(list&); // definitions list wrong; list* ok; make_list(); // wrong, need size sort_list(wrong); // hmm, wrong? // equivalence // Эти структуры задают разные типы struct my_class {int x; int y;}; struct your_class{int x; int y;};
  13. 13. Операторы С++ Basics. Valery Lesin, 2013 13 Семантика Синтаксис Область видимости [namespace|class]::name Выбор члена object.member ptr->member Доступ по индексу pointer[] Вызов функции expr(expr-list) Постфиксный инкремент lvalue++ Идентификатор типа typeid({expr|type}) Преобразование типов static_cast<type>(expr) Взятие размера sizeof({expr|type}) Унарные префиксные операторы ~lvalue Разыменование *expr Выделение/освобождение памяти new type (expr-list)
  14. 14. Операторы, часть 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
  15. 15. Выражения • Результат: – Расширение к большему (например, *) – Логическое выражение 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) {...}
  16. 16. Инкремент/Декремент • Префиксный: изменил, вернул новое значение • Постфиксный: изменил, вернул старое значение С++ 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);
  17. 17. Инструкция (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) – для определения переменных потребуются скобки {}
  18. 18. Циклы • Управление циклом: – досрочный выход: 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) // examples for (size_t i = 0, size = strlen(src); i < size; ++i) dest[i] = src[i]; while(*dest++ = *src++); // don't do this
  19. 19. Комментарии • Лучше вообще без комментариев, чем нерелевантные комментарии • Если можно выразить кодом, не пишите комментарии • Сложный алгоритм – дай ссылку на статью • Желательно написать: – сложный код (например, оптимизация) – а-ля разметка (окончание namespace) – в заголовке файла (зачем он, copyright) С++ Basics. Valery Lesin, 2013 19 1. 2. 3. // one line /* multi line */
  20. 20. Вопросы? С++ Basics. Valery Lesin, 2013 20

×