编程范式游记
陈皓(网名“左耳朵耗子”)
资深技术专家
立即订阅
2 人已学习
课程目录
已更新 11 讲 / 共 11 讲
01 | 编程范式游记:起源
免费
02 | 编程范式游记:泛型编程
03 | 编程范式游记:类型系统和泛型的本质
04 | 编程范式游记:函数式编程
05 | 编程范式游记:修饰器模式
06 | 编程范式游记:面向对象编程
07 | 编程范式游记:基于原型的编程范式
08 | 编程范式游记:Go 语言的委托模式
09 | 编程范式游记:编程的本质
10 | 编程范式游记:逻辑编程范式
11 | 编程范式游记:程序世界里的编程范式
编程范式游记
登录|注册

02 | 编程范式游记:泛型编程

陈皓 2019-07-16
上一篇文章中,我从 C 语言开始说起,聊了聊面向过程式的编程范式,相信从代码的角度你对这类型的语言已经有了一些理解。作为一门高级语言,C 语言绝对是编程语言历史发展中的一个重要里程碑,但随着认知的升级,面向过程的 C 语言已经无法满足更高层次的编程的需要。于是,C++ 出现了。

C++ 语言

1980 年,AT&T 贝尔实验室的 Bjarne Stroustrup 创建的 C++ 语言横空出世,它既可以全面兼容 C 语言,又巧妙揉和了一些面向对象的编程理念。现在来看,不得不佩服 Stroustrup 的魄力。在这里,我也向你推荐一本书,书名是《C++ 语言的设计和演化》。
这本书系统介绍了 C++ 诞生的背景以及初衷,书的作者就是Stroustrup本人,所以你可以非常详细地从语言创建者的角度了解他的设计思路和创新之旅。当然,就是在今天,C++ 这门语言也还有很多争议,这里我不细说。如果你感兴趣的话,可以看看我几年前在酷壳上发表的文章《C++ 的坑真的多吗?》。
从语言角度来说,实际上早期 C++ 的许多工作是对 C 的强化和净化,并把完全兼容 C 作为强制性要求(这也是 C++ 复杂晦涩的原因,这点 Java 就干得比 C++ 彻底得多)。在 C89、C99 这两个 C 语言的标准中,有许多改进都是从 C++ 中引进的。
可见,C++ 对 C 语言的贡献非常之大。是的,因为 C++ 很大程度就是用来解决 C 语言中的各种问题和各种不方便的。比如:
用引用来解决指针的问题。
用 namespace 来解决名字空间冲突的问题。
通过 try-catch 来解决检查返回值编程的问题。
用 class 来解决对象的创建、复制、销毁的问题,从而可以达到在结构体嵌套时可以深度复制的内存安全问题。
通过重载操作符来达到操作上的泛型。(比如,消除《01 | 编程范式游记:起源》中提到的比较函数cmpFn,再比如用>>操作符消除printf()的数据类型不够泛型的问题。)
通过模板 template 和虚函数的多态以及运行时识别来达到更高层次的泛型和多态。
用 RAII、智能指针的方式,解决了 C 语言中因为需要释放资源而出现的那些非常 ugly 也很容易出错的代码的问题。
用 STL 解决了 C 语言中算法和数据结构的 N 多种坑。

C++ 泛型编程

C++ 是支持编程范式最多的一门语言,它虽然解决了很多 C 语言的问题,但我个人觉得它最大的意义是解决了 C 语言泛型编程的问题。因为,我们可以看到一些 C++ 的标准规格说明书里,有一半以上都在说明 STL 的标准规格应该是什么样的,这说明泛型编程是 C++ 重点中的重点。
理想情况下,算法应是和数据结构以及类型无关的,各种特殊的数据类型理应做好自己分内的工作,算法只关心一个标准的实现。而对于泛型的抽象,我们需要回答的问题是,如果我们的数据类型符合通用算法,那么对数据类型的最小需求又是什么呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编程范式游记》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(7)

  • Transient
    原来回调函数是为了实现更加抽象的泛型问题,实现了业务逻辑和数据操作的分离。
    2019-07-26
    5
  • 俩孩儿他爸
    template<class Iter, class Cond>
    size_t count_if(Iter begin, Iter end, Cond c){
    return reduce(begin, end, 0,
    counter<Iter::value_type, Cond>(c));
    }
    对于本例中reduce最后一个参数的用法没有理解太好,可以写成下面的形式吗?
    counter<Iter::value_type, Cond> c;
    return reduce(begin,end,0,c);
    忘赐教?
    2019-07-24
    2
    1
  • 沧月寒心
    template <class T>
    class container {
    public:
        class iterator {
        public:
            ...
            self_type operator++() { self_type i = *this; ptr_++; return i; }
            self_type operator++(int junk) { ptr_++; return *this; }
            ...
            ...
        private:
            pointer _ptr;
        };
        ...
        ...
    };

    这里定义pointer _prt,在函数里面用的是ptr_。
    2019-07-22
    1
  • teddytyy
    counter<Iter::value_type, Cond>(c) 怎么匹配()运算符重载的?没看懂......
    2019-11-26
  • glbfor.gtw
    🐭神 两个++重载方法貌似都写疏忽了。
    2019-08-27
  • 稻壳dotcoo
    之前用c语言宏 实现过一些基础的数据结构和算法 想支持范型 文章中说的大部分问题都遇到了 非常有感触 其实看看我写的宏 和c++的模版多么神似
    2019-07-26
  • 0xAC7
    不懂 C++,看看思想吧
    2019-07-24
收起评论
7
返回
顶部