面向对象class杂项笔记

闲扯

众所周知,c++编程范式比较多, 实际工程中通常面向对象和泛型编程比较多, 有时候不一样的项目组的喜爱有差别致使代码的编程范式不一样, 互相review的时候基本看不懂对方的代码(喜欢泛型的应该看面向对象的没啥压力, 可是没怎么用过泛型的看着一堆template就比较头疼); 看过的项目代码不多,不知道如今(现代)业界c++通常什么是最佳范式.c++

  • 泛型编程(Generic Programming) : STL大量使用, 核心是template class/Iterator class组合而成算法

  • 面向对象编程(Object-Oriented Programming): 经过对类的虚继承而实现了多态, 复杂的对象模型.编程

不考虑类的继承, 实际上一个template class涉及的方方面面知识点已经比较全面了, 所以列出相关的知识点权当笔记.函数

explicit

其实这个没什么好说的, 一个non-explicit构造函数原本就是比较别扭的, 保守一点直接加上explicit防止犯错的机会. 不管是转成类对象仍是类对象转成内置类型, 都显示转换, 后者直接利用:性能

operator double() const {}指针

pointer-like classes

若是要找出一个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为了统一全部迭代器操做, 对迭代器的实现是有要求的, 通常本身实现的迭代器起码应该提供解引用/自增(前置/后置)/相等等操做.继承

function-like class

不复杂的功能基本上能够被lambda表达式所替代, 然后者提供更好的可读性和等价的性能, 要否则代码中一堆函数对象类, 看着头晕;固然熟悉一下标准库中已内置的函数对象类仍是颇有必要的.ip

auto

减轻了不少心智负担, 并且c++14中, lambda表达式中也可使用auto, 能够直接这么用; 通常搭配range for来用

auto multiply = [](auto a, auto b) {return a*b;};

对象模型

c++中类的大小取决于元素的类型和个数; 编译器对齐策略. 其中,c++的多态的实现有赖于虚函数表,对于没有虚函数的函数调用来讲,静态绑定编译时肯定调用方法, 而有虚函数的函数调用,则运行时确认.

  • 是不是虚函数,若是是,则会给虚函数表指针分配空间

  • 对于空类,编译器也分配了一个字节大小的位置

  • 考虑到字节对齐,编译器会自动在最后多分配一些空间(具体多少和32/64相关)

template class实现

  • 除了常规的构造/赋值/拷贝以外,和普通的类的区别在于,在类声明外的函数定义, template<typename X>也是限定符之一.

  • template class不只可以传递变量类型, 同时能够传递函数对象(函数对象也是常量表达式的一种), 经过提供不一样的方法而构造不一样的类对象.

相关文章
相关标签/搜索