众所周知,c++编程范式比较多, 实际工程中通常面向对象和泛型编程比较多, 有时候不一样的项目组的喜爱有差别致使代码的编程范式不一样, 互相review的时候基本看不懂对方的代码(喜欢泛型的应该看面向对象的没啥压力, 可是没怎么用过泛型的看着一堆template就比较头疼); 看过的项目代码不多,不知道如今(现代)业界c++通常什么是最佳范式.c++
泛型编程(Generic Programming) : STL大量使用, 核心是template class/Iterator class组合而成算法
面向对象编程(Object-Oriented Programming): 经过对类的虚继承而实现了多态, 复杂的对象模型.编程
不考虑类的继承, 实际上一个template class
涉及的方方面面知识点已经比较全面了, 所以列出相关的知识点权当笔记.函数
其实这个没什么好说的, 一个non-explicit
构造函数原本就是比较别扭的, 保守一点直接加上explicit
防止犯错的机会. 不管是转成类对象仍是类对象转成内置类型, 都显示转换, 后者直接利用:性能
operator double() const {}指针
若是要找出一个STL中的相似class的话, 那么就是各个容器类的迭代器了. Iterator class
或者说pointer-like class
通常不单独使用, 而是附着在容器中, 方便赞成操做, 好比有一个容器类:code
class A { public: /// private: vector<int> vecs; };
为了方便对把类用于算法, 要求类提供诸如begin()
和 end()
方法, 那么就须要在类内部嵌套一个迭代器类型了, 以下对象
class A { public: typedef A_iterator iterator; friend class A_iterator; iterator begin(); iterator end(); private: vector<int> vecs };
而后对于迭代器的操做, 内聚到A_iterator
中去实现, 固然STL为了统一全部迭代器操做, 对迭代器的实现是有要求的, 通常本身实现的迭代器起码应该提供解引用/自增(前置/后置)/相等等操做.继承
不复杂的功能基本上能够被lambda
表达式所替代, 然后者提供更好的可读性和等价的性能, 要否则代码中一堆函数对象类, 看着头晕;固然熟悉一下标准库中已内置的函数对象类仍是颇有必要的.ip
减轻了不少心智负担, 并且c++14中, lambda
表达式中也可使用auto
, 能够直接这么用; 通常搭配range for
来用
auto multiply = [](auto a, auto b) {return a*b;};
c++中类的大小取决于元素的类型和个数; 编译器对齐策略. 其中,c++的多态的实现有赖于虚函数表,对于没有虚函数的函数调用来讲,静态绑定编译时肯定调用方法, 而有虚函数的函数调用,则运行时确认.
是不是虚函数,若是是,则会给虚函数表指针分配空间
对于空类,编译器也分配了一个字节大小的位置
考虑到字节对齐,编译器会自动在最后多分配一些空间(具体多少和32/64相关)
除了常规的构造/赋值/拷贝以外,和普通的类的区别在于,在类声明外的函数定义, template<typename X>也是限定符之一.
template class不只可以传递变量类型, 同时能够传递函数对象(函数对象也是常量表达式的一种), 经过提供不一样的方法而构造不一样的类对象.