C++ 2: Возможности языка стандарта C++11

  • 142 views
Uploaded on

* auto, decltype …

* auto, decltype
* lambda 
* range based for 
* initializer list 

  • 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
142
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
1
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. Лекция 8. Нововведения С++11. Valery Lesin. C++ In-Depth, 2014 1 Часть 1
  • 2. auto & decltype (vs10, gcc4.4) • Значительно упрощают указание типов. Valery Lesin. C++ In-Depth, 2014 2 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. auto x = 5; auto it = vec.begin(); auto& value = my_map[key]; decltype(5 + 12.) const& y = 5.; //... template<class type1, class type2> auto dot_product(type1 var1, type2 var2) -> decltype(var1 * var2) { return var1 * var2; } template<class T, class A> auto vector<T, A>::begin() -> iterator {/*...*/}
  • 3. Alias templates (gcc4.7) • Появилась возможность делать typedef на шаблонный тип Valery Lesin. C++ In-Depth, 2014 3 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. typedef std::map<std::string, size_t> words_counter_t; template<class type> using obj_counter = std::map<type, size_t>; using ivec = std::vector<int>; //.. obj_counter<int> digit_counter;
  • 4. Range-based for (vs11, gcc4.6) • Появилась возможность делать typedef на шаблонный тип Valery Lesin. C++ In-Depth, 2014 4 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. list<string> strings; for (list<string>::iterator it = strings.begin(); it != strings.end(); ++it) {/*.*/} for (auto it = strings.begin(); it != strings.end(); ++it) {/*.*/} for (string& str: strings) {/*.*/} for (auto& str: strings) {/*.*/}
  • 5. nullptr constant (vs10, gcc4.6) • nullptr может приводится к указателям, bool, но не к целым или floating-point Valery Lesin. C++ In-Depth, 2014 5 1. 2. 3. 4. 5. 6. 7. 8. 9. void process(int); void process(const char*); //.. // nullptr could be cast to pointer or bool // not to int or double process(0); // what function will be called? process(nullptr);
  • 6. initializer list (vs11, gcc4.4) • копируется только по ссылке • создается только синтаксисом через {} Valery Lesin. C++ In-Depth, 2014 6 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. struct compl { double real; double img; }; compl c = {3, 4}; int a [10] = {1, 2, 3, 5, 7, 11}; vector<int> = {1, 2, 4, 8, 16, 32}; map<int, string> = {{1, "one"}, {2, "two"}, {3, "three"}}; struct seq { seq(std::initializer_list<int> args) { assign(args.begin(), args.end()); } }; // one int equal to 4, or 4 ints with zero value? vector<int> = {4};
  • 7. type traits (vs8, gcc4.3) • Доступны через хидер <type_traits>. • Определяются разнообразные свойства типов. • Еще больше есть в boost type traits. Valery Lesin. C++ In-Depth, 2014 7 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. is_const is_standard_layout is_pod is_literal_type is_polymorphic is_abstract is_constructible is_trivially_constructible is_nothrow_constructible is_same is_base_of result_of is_integral is_floating_point is_class is_function is_member_function_pointer is_arithmetic is_reference
  • 8. constexpr (gcc4.6) • Такая функция должна возвращать значение. • Тело функции должно быть вида return выражение. • Выражение должно состоять из констант и/или вызовов других constexpr-функций. • Функция, обозначенная constexpr, не может использоваться до определения в текущей единице компиляции. Valery Lesin. C++ In-Depth, 2014 8 1. 2. 3. 4. 5. 6. 7. 8. size_t double_size(size_t size) { return 2 * size; } constexpr double_size_11(size_t size) { return 2 * size; } // error double arr[double_size(7)] = {}; // ok double arr[double_size_11(7)] = {};
  • 9. new string literals (vs11*, gcc4.5) • Позволяют задавать строку в Unicode кодировке. • Можно задать строку без экранирования символов. Valery Lesin. C++ In-Depth, 2014 9 1. 2. 3. 4. 5. 6. 7. u8"This is how to write in utf-8 & char u2018" u"This is how to write in utf-16 & char u2018" U"This is how to write in utf-32 & char U00002018" R"(raw string "without" special symbols)" u8R"delimiter(raw string "without" special symbols)delimiter";
  • 10. Delegating Constructors(vs11, gcc4.7) • Дефолтные значения уходят в реализацию. • Объект считается созданным уже после первого конструктора. Valery Lesin. C++ In-Depth, 2014 10 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. struct string { explicit string(const char* str) {/*...*/} string(string const& other) : string(other.c_str()){/*...*/} }; struct def { def(size_t number) {/*...*/} def() : def(238) {/*...*/} };
  • 11. Inheriting Constructors (gcc4.8) • Можно наследовать либо все конструкторы, либо ниодного. • Не могут быть конструкторы в множественных базовых классах с одинаковым прототипом. • Аналогично не может быть собственного конструктора с совпадающим по прототипу с базой конструктором. Valery Lesin. C++ In-Depth, 2014 11 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. struct base { base(const char* str) {/*...*/} }; struct derived : base { derived(size_t number) {/*...*/} using base::base; };
  • 12. Non-static data member initializers(gcc4.7) • Полю будет присвоено указанное значение, если его не перекрывает конструктор. Valery Lesin. C++ In-Depth, 2014 12 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. class some { public: some() {} explicit some(int new_value) : value(new_value) {} private: int value = 15; string name = "Stefan"; };
  • 13. Вопросы? Valery Lesin. C++ In-Depth, 2014 13