Your SlideShare is downloading. ×
  • Like
2013 10 01_lecture_04
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

2013 10 01_lecture_04

  • 2,852 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,852
On SlideShare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
17
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Лекция 4. Встроенные типы, инструкции и операторы. С++ Basics. Valery Lesin, 2013 1
  • 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. Размеры типов С++ 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. Явное приведение типов • Базовые типы неявно приводятся друг у другу. Многие с потерей значимости (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. Тип 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. 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. Перечисления 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. Синоним имени typedef • Задает синоним имени, не задает новый тип • Делает код короче – проще читать • Платформонезависимые типы • «Протаскивает» тип через шаблон • Имеет внутреннюю компоновку С++ Basics. Valery Lesin, 2013 8 1. 2. 3. typedef std::map<std::string, student> students_t;
  • 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. Области действия и видимости С++ 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. Структуры 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. Структуры 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. Операторы С++ 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. Операторы, часть 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. Выражения • Результат: – Расширение к большему (например, *) – Логическое выражение 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. Инкремент/Декремент • Префиксный: изменил, вернул новое значение • Постфиксный: изменил, вернул старое значение С++ 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. Инструкция (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. Циклы • Управление циклом: – досрочный выход: 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. Комментарии • Лучше вообще без комментариев, чем нерелевантные комментарии • Если можно выразить кодом, не пишите комментарии • Сложный алгоритм – дай ссылку на статью • Желательно написать: – сложный код (например, оптимизация) – а-ля разметка (окончание namespace) – в заголовке файла (зачем он, copyright) С++ Basics. Valery Lesin, 2013 19 1. 2. 3. // one line /* multi line */
  • 20. Вопросы? С++ Basics. Valery Lesin, 2013 20