C++11新特性概览
- 2019 年 12 月 25 日
- 笔记
今天买的《C++ Primer 第五版》到了,这一版本一个比较好的地方是。在开始的目录里面列出来了全书中涉及到的C++11新特性的地方,标明了页码,可以直接到对应的页面去看新特性的东西。于是我对照书上的例子,写了一些简单的示例,用来大概的了解C++11的新特性,总结在这里,以后可以查查。
#include <iostream> #include <cstdlib> #include <vector> #include <array> #include <iterator> #include <functional> using namespace std; constexpr int size(){return 100;} // constexpr function, compiler will convert it to inline function void func(initializer_list<int> li) { cout << "func with " << li.size() << "elements" << endl; } // vector<int> func2() { return {1,2,3}; } int main() { long long ll = 64; //long long: 64 bit at least //2. list initialization int a = {0}; int bb{0}; vector<int> v2 = {1,2,3}; //3. nullptr, a new literal int *p = nullptr; //equals to int *p2 = 0; int *p3 = NULL;// must include <cstdlib> first //4. constexpr constexpr int ci = 30; constexpr float cf = ci * 0.2; constexpr int sz = size(); // it's ok to initialize a constexpr value using constexpr function //5. alias declaration using my_int = int; my_int i = 10; using vi = vector<int>; vi v = {1,2,3,5}; using it = vector<int>::iterator; for (it it_i = v.begin(); it_i != v.end(); ++it_i) { cout << *it_i << endl; } //6. auto auto aa = 3; // compiler will infer that a's type is int //7.decltype decltype(i) id1 = 0; // id1 has the same type with i decltype((i)) id2 = id1; // NOTE: (var) returns reference! so id2 is a reference to id1 //7. in-class initializer /* struct my_struct { int i = 0; int b = 2; string s; }; */ //8. range for string hello = "hello, world!"; for (auto c : hello) { cout << c << endl; } //9. vector of vector, no space anymore! //before: vector<vector<int> > vv1; //now: vector<vector<int>> vv2; //10. cbegin, cend, return const_iterator don't care if container is const vector<int> vi10 = {4,4,54}; const vector<int> cvi10 = {4,4,54}; auto it10 = vi10.cbegin(); // it10: const_iterator type auto cit10 = cvi10.cbegin(); // cit10: const_iterator type //11. begin and end of pointer, included in <iterator> int ia[] = {1,3,4}; int *b = begin(ia); int *e = end(ia); //12. initializer_list func({1,2,3,4}); //13. trailing return type /* auto func(int i) -> int(*)[10]; */ //14. =default: don't replace default initializer function /* class A { public: A() = default; }; */ //15. delegating constructor /* class A { public: A(int i, float f, double d):ii(i), ff(f), dd(d) {} A(int i, float f): A(i, f, 0) {} A(int i): A(i, 0, 0) {} private: int ii; float ff; double dd; }; */ //16. array array<int, 3> a1 = {{1,2,3}}; auto aa1 = a1.begin(); //17.forward_list //18. emplace //19. shrink_to_fit //20. to_string int i20 = 233; string s20 = to_string(i20); //21. lambda auto f211 = [] () {return 23;}; auto f212 = [i20]() {return i20 > 20;}; auto f213 = [i20]() -> int {if(i20> 20) return 1; else return 0;}; //22. bind, included in <functional> /* int f(int a, int b) { return a>b ? a : b; } auto g = bind(f, _1, 10); */ //23. unordered associative container, managed by hash //including unordered_map, unordered_set, unordered_multimap, unordered_multiset //24. smart pointer,including shared_ptr, unique_ptr, weak_ptr //25. rvalue reference int i25 = 42; int && rr = i25*42; //ERROR: variable is lvalue //int &&rr2 = rr; //26. std::move int &&rr3 = std::move(rr); //27. noexcept,use for moving copy or moving operator //28. reference qualifier /* class A{ public: A sorted() &&; //rvalue reference A sorted() &; //lvalue reference }; */ //29. function template, included in <functional> //function<int(int, int)> f1 = add; //add is a function declared before //30. explicit conversion operator /* class A { explicit operator int() const {return val;}; }; */ //31. final to prevent inherit class Last final {}; // Last can't be a basic class //32.override: override virtual functions in parents class //33. tuple tuple<int, int, int> tt{1,2,4}; auto tt1 = get<0>(tt); auto tt2 = get<1>(tt); auto tt3 = get<2>(tt); return 0; }