摘要:
封装性,继承性,多态性是面向对象语言的三大特性。其中封装,继承好理解,而多态的概念让许多初学者感到困惑。本文将讲述C++中多态的概念以及多态的实现机制。 阅读全文
摘要:
学习C++标准算法时,我们知道带有_if的算法都带有一个谓词函数。此前我们直接使用函数名充当谓词函数,这样做有很大的局限性( 下文会做分析 )。为此本文将介绍C++中一个新的技术:函数对象。用它来充当谓词函数就能解决这个问题。 阅读全文
摘要:
有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观。就目前看来,要实现这一点,最核心的莫过于操作符的重载。科学的重载可以让类的使用最大程度地接近内置类型。本文将讨论类操作符重载涉及到的一些原则和具体做法。 阅读全文
摘要:
经过前两篇随笔( 上 中 )的分析我们已经解决了具有指针成员的同类对象“ 干涉 ”问题。可惜,前面给出的解决方案代码还是不完整。还有什么问题呢?观察发现,构造函数里面有new的关键字出现,也就是说开辟了新的内存空间,我们也知道new必须也只能对应一个delete,而不应该让系统自己处理( 还不熟练new和delete用法的点这里 ),但这里和new对应的delete去哪里了? 阅读全文
摘要:
先思考一下上一篇随笔前言中提出的问题。请问:仅仅自定义了复制函数就可以避免带有指针成员的同类对象相互干扰吗?很遗憾,还不够。请思考以下情形( A中依然带有指针成员 ):A a1; A a2; a1 = a2; 在最后一句执行时,复制函数并不会启用( 这种情况启用的是默认的赋值运算符 ),因此上篇随笔提到的问题( 对象相互干扰 )依然会发生。为此,我们还得再重载赋值运算符,才能彻底避免这种冲突干扰现象。 阅读全文
摘要:
若要将a对象复制给b对象,编译器应当做何工作?C++初学者也许会直接说” a对象的成员复制给b对象的成员 “。在很多情况下,这种说法正确,事实上C++会给类定义一个默认的复制函数,它所做的工作也正是如此。但,下面问题来了:如果类的成员当中有指针,这种做法还行吗?本文将对这个问题作出实例分析。 阅读全文
摘要:
C++提供了很多算法(超过一百个),要想掌握这些算法的使用需要将它们都死记下来吗?当然不用了,本文将为你剖析泛型算法的基本结构,让你以后对这些算法做到“ 望名生义 ”。 阅读全文
摘要:
标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手。那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法。他们错了,错在IO流确实不是容器,但它能绑定一种特殊的迭代器,叫做流迭代器。一些算法能以流迭代器为参数,对IO流进行控制。 阅读全文
摘要:
本文将讲解一个经典的文本查询程序,对前面所学的容器相关知识进行一个从理论到实际的升华,同时也对即将学习的面向对象知识来一次初体验。 阅读全文
摘要:
multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值。对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器。那么对于multimap容器来说,find函数将如何运作呢?如果要实现和map容器的find函数同样的功能,则它将返回多个迭代器,这样太复杂了。本文将讲解C++中multimap容器的“ find实现 ”。 阅读全文
摘要:
我们可以用下标访问顺序容器的元素,也就是说在顺序容器实现中下标和元素的值相关联。那么能不能让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。 阅读全文
摘要:
vector容器的数据结构原型是顺序表,它很好的实现了顺序表的功能,大大方便了编程。好了,现在假设有天我又想用栈,那么有没有栈对应的容器呢?很遗憾,木有。但基于“栈”可以由顺序表或者链表实现这一特性,C++提供了stack给我们使用,来解决栈的实现这个问题。stack可不是类,也不是容器,那它是什么呢?它就是本文要讨论的一个新的类型 --- 容器适配器。 阅读全文
摘要:
常见的顺序容器主要有三种 - vector,deque,list。它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题。 阅读全文
摘要:
容器是指容纳特定类型对象的集合。顺序容器则是指该容器根据位置访问保存在其中的对象。Vector,List,Deque是三种常见的容器,本文将归纳这三种容器常用的函数,以备日后查阅。 阅读全文
摘要:
字符串流对象有个很实用的功能就是格式转换。比如可以将整数类型的123转换成字符串格式的123,或者反过来。那么具体又是如何实现的?且看下文。 阅读全文
摘要:
本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅。 阅读全文
摘要:
你是否遇到过以下情况?
情况一:为了调试方便,代码中夹杂各种cout语句。当调试好了,把这些语句删了,运行“正式版”后,又发现新问题,只得把这些cout语句一个个添加回去再进行调试。如此不断循环。
情况二:希望在代码中获取到源文件的文件名,当前代码行号,编译时间等信息。
情况三:纠结于是否实现某些概率极低(几乎不存在)的错误检测
如果有,那么这篇随笔适合你,或者说,预处理器带来的调试技术适合你。 阅读全文
摘要:
对于隐式转换,想必你已经了解了算数转换中的“ 向上对齐 ”的概念;了解了赋值隐式转换的规律( 右值类型转换为左值类型 )。但C++中的隐式转换远不止这些,本文就将告诉你一些容易被忽略,但事实上发生了的隐式转换。 阅读全文