2014-03-07_c++11 / c++11
.pdf// стандарт C++11
Открытые студенческие лекции НГТУ
Александр Кромм mmaulwurff@gmail.com
// C++11
/*
Ранее — C++0x.
Принят ISO 12 августа 2011.
Предыдущий стандарт — C++03. */
2
//auto
//Было: auto — спецификатор хранения переменной.
//C++03
for ( std::vector<std::map<int, std::string>>::const_iterator it = container.begin();
it != container.end(); ++it ) { /* ... */ }
//Стало: вывод типов
//C++11
for ( auto it = container.begin();
it != container.end(); ++it ) |
|
{ /* ... */ } |
3 |
|
//nullptr
//Было: NULL == 0
//Стало: std::nullptr_t nullptr
int* pnt = nullptr; // ok bool flag = nullptr; // ok int num = nullptr; // не ok
4
//range-based for
//нужны begin(), end()
int arr[10];
for ( int i : arr ) { /* ... */ }
std::map<std::string, std::vector<int>> map; for ( const auto &kvp : map )
{ /* ... */ }
5
// override
class Base { |
|
|
virtual int |
foo(int val) const; |
|
}; |
|
|
class Derived : Base { |
|
|
int foo(int |
val) override; |
// не ok |
int foo(int |
val) const override; // ok |
|
int foo(float val) override; |
// не ok |
|
}; |
|
|
6
// final
class Base {
virtual int foo(int val) const final; virtual int bar();
};
class Derived : Base {
int foo(int val) const; // не ok int bar() override final; // ok
};
class DerivedNext : Derived { int bar(); // не ok
}; |
7 |
//enum class
//глобальная область видимости
enum OldEnum { YES, NO }; int yes = YES; // ok
enum class Enumeration { ONE, TWO }; int one = Enumeration::ONE; // не ok
Enumeration two = Enumeration::TWO; // ok
enum class TypeEnum : unsigned { HELLO, BYE };
8
//умные указатели
//объект уничтожается,
//когда указатель выходит из области видимости
std::unique_ptr<int> unique;
//разделяемая память. объект уничтожается, когда
//последний указатель выходит из области видимости std::shared_ptr<int> shared;
//ссылается на объект, управляемый shared_ptr,
//но не ведёт подсчёт ссылок
std::weak_ptr<int> weak;
9
//лямбда-функции
//(безымянные локальные функции)
[capture](param) -> ret_type { body } // пример
std::vector<int> some_list{ 1, 2, 3, 4, 5 }; int total = 0;
std::for_each(begin(some_list), end(some_list), [&total](int x) { total += x; });
//http://habrahabr.ru/post/66021/
//https://en.wikipedia.org/wiki/Anonymous_function
10