Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

659 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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

  1. 1. Лекция 8. Нововведения С++11. Valery Lesin. C++ In-Depth, 2014 1 Часть 1
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 13. Вопросы? Valery Lesin. C++ In-Depth, 2014 13

×