Posts List

C++11:列表初始化

列表初始化的语法{ arg1, arg2, ... }非常直观,合理使用能简化代码以及增强可读性。 列表初始化的常用语法 直接列表初始化 语法 语义 T object { arg1, arg2, ... }; 对象构造 T { arg1, arg2, ... }; 临时对象构造 new T { arg1, arg2, ... } new构造对象 Class { T member { arg1, arg2, ... }; }; 成员直接初始化 Class::Class() : member{arg1, arg2, ...} {... 构造函数 ...

C++11:Range-based for loop

range-for 遍历一个range,对逐个元素做操作,比起之前的for循环,语法更简洁,可读性更高,同时引入range的概念大大提高适用范围。 语法 for ( range_declaration : range_expression ) loop_statement range_declaration 元素类型的命名变量声明,可以是原始类型,引用或auto声明 range_expression 表示范围的表达式,可以是原生数组 ...

C++11:模板显式实例化

模板显式实例化(extern template)可以用来确保模板只被编译器实例化一次,有两个好处: 这样使用模板生成的编译单元不会重复实例化,会加快编译速度,并减小编译单元的尺寸 如果模板类中包含静态成员对象,当这种模板类被多个动态库(如dll, ...

C++11:非静态成员的初始化

从C++11开始,类声明支持非静态成员的初始化,而在C++11之前,仅支持常整型静态成员初始化,新特征的支持,使得初始化变的灵活,很多时候可以减少代码量。 关于C++98的成员初始化 int var = 7; class X { static const int m1 = 7; // ok const int m2 = 7; // error: not static static int m3 = 7; // ...

C++11:decltype

decltype(expression)是一个标识符或者表达式的数据类型的推断,它可以用在变量声明中作为变量的数据类型。decltype类型说明符常常和auto关键字一起用于模板库的开发。 语法 decltype( expression ) 类型推断规则 如果 expression 参数是标识符或类成员访问 ...

C++11:override和final

从C++11开始,继承体系新增关键字override和final,让继承和成员函数覆盖更加规范和安全,在编译期做了保证。 override关键字 在成员函数的声明或定义中,override表示该成员方法是virtual的,并且是用来覆盖基类的虚 ...

Exit-time-destructor 问题

C++全局对象, 静态对象,或类的静态成员对象,在进程退出时会执行析构函数,并且动作发生在main函数结束之后。 进程都要退出了,一般没有必要再执行析构函数了,如果真的需要执行析构,那也应该是运行时显式调用释放资源的方法。 在xcode中可以配置 ...

C++11:Type Alias and Alias Template

Type alias is a name that refers to a previously defined type (similar to typedef), and alias template is a name that refers to a family of types. Syntax Alias declarations are block declarations with the following syntax: using identifier = type-id; template < template-parameter-list > using identifier = type-id; identifier - the name that is introduced by this declaration template-parameter-list - template parameter list, as in template declaration type-id - abstract declarator or any other valid type-id. For alias template declaration, type_id cannot directly or indirectly refer to identifier Explanation A type alias declaration introduces a name which can be used as a synonym for the type denoted by type-id. It does not introduce a new type and it cannot change the meaning of an existing type name. ...

C++11:多线程

C++11对多线程有了直接的支持,这对于跨平台的统一的线程管理和使用是个福音。 C++11多线程库提供了std::thread类,用于创建和管理线程,还为共享资源的竞态问题提供了互斥量(mutex)、锁、事件通知的条件变量(condition ...

重载匿名函数对象集

C++11支持lambda,匿名函数可以随处方便的书写,但是支持多种调用方式的匿名函数却不能直接支持。 重载匿名函数 可以借助于以下的overload_set方法实现: 继承自匿名函数对象类型; 通过using F::operator()声明访问匿名 ...

lambda函数与递归

lambda函数是匿名的,但是如果需要实现递归,那么必须要绑定名字,但是我们又不想因此而麻烦去定义函数。 关于绑定名字: 对于python这样的动态类型语言,可以直接将lambda函数赋值给变量; 对于C++这种强静态类型,可以使用函数存储器bo ...

C++模板 - 编译期的函数式编程

C++模板在编译期的行为与纯函数式编程有很多相似之处。通过观察函数式编程,并使用C++模板与之类比,来深入分析C++模板作为C++编译期的函数式编程的基础设施,掌握C++模板的本质及其灵活应用。 函数式编程的基本特征: 没有变量,函数没有副作用 ...

C++11:variadic templates

本质上,变长模板参数(Variadic Templates)也是一种函数式编程中常用的列表模式匹配。 变长模板参数 变长模板参数是对原有C++模板的轻量级的扩展,增加了对…省略号的支持,即: 如果模板参数带…,那么该模板参数可以匹配0个或多个实参; ...

类模板的静态成员初始化

与类模板的成员函数的非内联定义一样,类模板的static类型的数据成员需要使用外层模板的声明方式来初始化。 例子 template <typename T> classCSingleton { public: static T* Instance() { Lock::CLockWrapper guard(CriticalSection_); if (m_instance == NULL) { m_instance = new T; } ASSERT(m_instance != NULL); return m_instance; }; static void DestroyInstance() { Lock::CLockWrapper guard(CriticalSection_); if (m_instance) delete m_instance; m_instance = NULL; }; protected: CSingleton() { }; virtual ~CSingleton() { }; private: CSingleton(const CSingleton& source) { }; static T* m_instance; static Lock::CCriticalSectionWrapper CriticalSection_; }; template <typename ...

C++运行时惯用法

本文整理了C++的一些运行时的惯用法。 pimpl惯用法 对于一个类型T来说,如果内部使用了其他的类型U: 可以将U直接做为数据成员,但是这样T和U是耦合的,因为U的定义对于T必须是可见的; 也可以只适用U的指针作为数据成员,这样只要有前置声明,知 ...