Introduction to C++11 and its use inside Qt Olivier Goffart February 2013 1/43 Introduction to C++11 and its use inside Qt
About Me http://woboq.com http://code.woboq.org 2/43 Introduction to C++11 and its use inside Qt
History 1979: C With classes 1983: C++ 1991: Qt development begins (Qt 1.0 in 1995) 1998: C++98 - First standardized C++ 2003: C++03 - Only few corrections 2005: Qt 4.0 2011: C++11 2012: Qt 5.0 3/43 Introduction to C++11 and its use inside Qt
Goals of C++11 From the C++11 FAQ: Make C++ a better language for systems programming and library building that is, to build directly on C++’s contributions to programming, rather than providing specialized facilities for a particular sub-community (e.g. numeric computation or Windows-style application development). Make C++ easier to teach and learn through increased uniformity, stronger guarantees, and facilities supportive of novices (there will always be more novices than experts). 4/43 Introduction to C++11 and its use inside Qt
Rules of Thumbs From the C++11 FAQ: Maintain stability and compatibility Prefer libraries to language extensions Prefer generality to specialization Support both experts and novices Increase type safety Improve performance and ability to work directly with hardware Fit into the real world 5/43 Introduction to C++11 and its use inside Qt
Example QString processString( const QString &str) 1 { 2 State {Ok , Cancel }; enum 3 QVector <QPair <State , QString >> stack; 4 stack.append ({ State ::Ok , str }); 5 //... 6 } 7 What is specific to C++11 in this code? 6/43 Introduction to C++11 and its use inside Qt
Example QString processString( const QString &str) 1 { 2 State {Ok , Cancel }; enum 3 QVector <QPair <State , QString >> stack; 4 stack.append ({ State ::Ok , str }); 5 //... 6 } 7 What is specific to C++11 in this code? use of bracket initilizer 6/43 Introduction to C++11 and its use inside Qt
Example QString processString( const QString &str) 1 { 2 State {Ok , Cancel }; enum 3 QVector <QPair <State , QString >> stack; 4 stack.append ({ State ::Ok , str }); 5 //... 6 } 7 What is specific to C++11 in this code? use of bracket initilizer use of >> without a space 6/43 Introduction to C++11 and its use inside Qt
Example QString processString( const QString &str) 1 { 2 State {Ok , Cancel }; enum 3 QVector <QPair <State , QString >> stack; 4 stack.append ({ State ::Ok , str }); 5 //... 6 } 7 What is specific to C++11 in this code? use of bracket initilizer use of >> without a space Scoped State::Ok 6/43 Introduction to C++11 and its use inside Qt
Example QString processString( const QString &str) 1 { 2 State {Ok , Cancel }; enum 3 QVector <QPair <State , QString >> stack; 4 stack.append ({ State ::Ok , str }); 5 //... 6 } 7 What is specific to C++11 in this code? use of bracket initilizer use of >> without a space Scoped State::Ok use of local type State as template parameter 6/43 Introduction to C++11 and its use inside Qt
New Features 7/43 Introduction to C++11 and its use inside Qt
auto QString Obj::foo( int blah) 1 { 2 QHash < int , QString > dict = bar (); 3 auto it = dict.find(blah ); 4 //... 5 } 6 8/43 Introduction to C++11 and its use inside Qt
Member Initializers class X { 1 // ... 2 private : 3 bool m_enabled = false ; 4 int m_state = 0; 5 QByteArray m_name = "None"; 6 } 7 9/43 Introduction to C++11 and its use inside Qt
Range Based for bool Obj::foo( const QStringList &list) 1 { 2 for ( const QString &it : list) { 3 //... 4 } 5 } 6 10/43 Introduction to C++11 and its use inside Qt
Uniform Initialisation In C++98 int b(1); // variable definition 1 QVariant c(); // function declaration 2 QVariant d(QString ()); // oops 3 4 QPoint p(1 ,2); 5 int i = {2}; //yes , you can do that 6 QString a[] = { "foo", "bar" }; // ok 7 // QVector <QString > v = { "foo", "bar" }; // error 8 11/43 Introduction to C++11 and its use inside Qt
Uniform Initialisation In C++11 int b{1}; // variable definition 1 QVariant c{}; // default constructor 2 QVariant d{QString ()}; // Works as expected 3 4 QPoint p{1 ,2}; 5 int i = {2}; // = is optional 6 QString a[] { "foo", "bar" }; 7 QVector <QString > v = { "foo", "bar" }; // works 8 12/43 Introduction to C++11 and its use inside Qt
Uniform Initialisation In C++11 struct X { int a, b; }; 1 X x1 = X{1 ,2}; 2 X x2 = {1 ,2}; // the = is optional 3 X* p = new X{1 ,2}; 4 5 struct D : X { 6 D( int x, int y, int z) : X{x,y}, c{z} 7 { /* ... */ }; 8 int c; 9 }; 10 13/43 Introduction to C++11 and its use inside Qt
Uniform Initialisation In C++11 X foo( const X &a) { 1 X b{a}; 2 return {2 ,3}; 3 } 4 foo ({4 ,5}); 5 6 X x5{4.2, 4.5} // error: narrowing 7 8 // using initializer_list constructor (from Qt 4.8) 9 QVector <X> { {1,2}, {2,4}, {4,5} }; 10 14/43 Introduction to C++11 and its use inside Qt
initializer_list #ifdef Q_COMPILER_INITIALIZER_LISTS 1 template < typename T> 2 QVector <T>:: QVector(std:: initializer_list <T> args) 3 { 4 d = Data :: allocate(args.size ()); 5 copyConstruct(args.begin (), args.end(), d->begin ()); 6 d->size = args.size (); 7 } 8 #endif 9 15/43 Introduction to C++11 and its use inside Qt
C K&R syntax int plus(x, y) 1 int x; 2 int y; 3 { 4 return x + y; 5 } 6 16/43 Introduction to C++11 and its use inside Qt
Lambda λ 17/43 Introduction to C++11 and its use inside Qt
Lambda [foo] (int a) -> int { return a + foo; } Capture: Variables that you capture Parametter list: The perametters of the function Return type (optional) Function body 18/43 Introduction to C++11 and its use inside Qt
Lambda [foo] (int a) -> int { return a + foo; } struct { double foo; int operator()(int a) { return a + foo; } } 18/43 Introduction to C++11 and its use inside Qt
Lambda Example QList < int > f( const QList < int > &list , double foo) 1 { 2 functor = [foo]( int a) { return a + foo; }; auto 3 QtConcurrent :: mapped(list , functor ); return 4 } 5 19/43 Introduction to C++11 and its use inside Qt
Lambda capture int a{1}, b{2}, c{3}; 1 2 // ’a’ by value , ’b’ by reference 3 auto f1 = [a, &b]() { b = a; }; 4 5 // everything by reference 6 auto f2 = [&]() { b = a; }; 7 8 // everything by value 9 auto f3 = [=]() { return a + c; }; 10 11 // everything by value , ’b’ by reference 12 auto f4 = [=,&b]() { b = a + c; }; 13 20/43 Introduction to C++11 and its use inside Qt
Lambda Example (Qt5) void Doc:: saveDocument () { 1 QFileDialog *dlg = new QFileDialog (); 2 dlg ->open (); 3 QObject :: connect(dlg , &QDialog :: finished , 4 [dlg , this ]( int result) { 5 if (result) { 6 QFile file(dlg ->selectedFiles (). first ()); 7 // ... 8 } 9 dlg ->deleteLater (); 10 }); 11 } 12 21/43 Introduction to C++11 and its use inside Qt
Function Declaration struct Foo { 1 State { /*...*/ }; enum 2 /*...*/ 3 State func(State ); 4 }; 5 6 // Error 7 State Foo:: func(State arg) { /*...*/ } 8 22/43 Introduction to C++11 and its use inside Qt
Function Declaration struct Foo { 1 State { /*...*/ }; enum 2 /*...*/ 3 State func(State ); 4 }; 5 6 // Error 7 State Foo:: func(State arg) { /*...*/ } 8 Alternative function syntax auto Foo:: func(State arg) -> State 1 { /* ... */ } 2 22/43 Introduction to C++11 and its use inside Qt
decltype template < typename A, typename B> 1 dotProduct(A vect_a , B vect_b) auto 2 -> decltype (vect_a [0]* vect_b [0]) 3 { /*...*/ } 4 5 6 7 QList < int > a{/*...*/}; 8 QVector < float > b{/*...*/}; 9 auto p = dotProduct(a, b); 10 23/43 Introduction to C++11 and its use inside Qt
Default and Deleted function MyObject { struct 1 virtual ~MyObject () = default ; 2 MyObject( int ); 3 MyObject () = default ; 4 int someFunction(QObject *); 5 int someFunction(QWidget *) = delete ; 6 }; 7 #define Q_DISABLE_COPY(Class) \ 1 Class( const Class &) = delete ; \ 2 Class & operator =( const Class &) = delete ; 3 24/43 Introduction to C++11 and its use inside Qt
Q_DECL_DELETE struct MyObject { 1 myFunction( int ); void 2 // ... 3 private : 4 myFunction( bool ) Q_DECL_DELETE ; void 5 }; 6 25/43 Introduction to C++11 and its use inside Qt
Rvalue References string { struct 1 char *data; 2 string( const char *str) : data(strdup(str)) {} 3 string( const string &o) : data(strdup(o.data )) {} 4 ~string () { free(data ); } 5 string & operator =( const string &o) { 6 free(data ); data = strdup(o.data) 7 return * this ; 8 } 9 }; 10 11 template < class T> swap(T &a, T &b) { 12 T tmp(a); a = b; b = tmp; 13 } 14 26/43 Introduction to C++11 and its use inside Qt
Recommend
More recommend