02 2014 档案
摘要:(转载请注明原创于潘多拉盒子) 智能指针(Smart Pointer)是C++非常重要的特性。考虑如下一段使用简单指针(Plain Pointer)的代码:A* a = new A();B* b = new B();......if (condition1){ // return之前必须delete所有new出来的对象 delete a; delete b; return true;}......if (condition2){ // return之前必须delete所有new出来的对象 delete a; delete b; return t...
阅读全文
摘要:(转载请注明原创于潘多拉盒子) C++是强类型语言,而且恐怕是强类型语言里面类型最严格的。这意味着:1. C++变量的类型在定义时就确定了;2. 该类型在后续的生命期中不会改变。比如:int n = 0;n = 3.14159; // n的类型不变,仍然为int型这样编译器产生的机器码是确定的,不需要运行时编译,比如像Python中的JIT(Just In Time)那样在代码执行过程中编译。 但是,这给代码的可复用性带来了麻烦。比如现实中我们可能会定义一个二元关系"void sort(T* array, int len){ // 直接实现基于抽象类型T的排序函数,这里的类型T...
阅读全文
摘要:(转载请注明原创于潘多拉盒子)其实指针不是C++的特性,而是地地道道的C的特性。有人说C++继承了C的指针,实在是败笔,造成内存泄漏云云,纯粹是不懂。可以这么说,如果没有指针,C++会逊色很多,应用的场景也会大大缩小。指针是一个变量,这个变量和一个int型的变量没有太大的不同,只是这个变量里存储的是它指向的对象的内存地址。指针可以指向任何对象,包括内置类型(int、long、double、float等),对象类型,函数入口,甚至另外一个指针或者可以指向任何类型 。涉及指针的操作符包括:定义指针(*)、解引用(*)、取地址(&)、取成员(->)、偏移解引用([]),偏移(+、-)、
阅读全文
摘要:(转载请注明原创于潘多拉盒子)构造函数和析构函数是C++中再熟悉不过的概念了,几乎每个了解一点C++的人都知道这两个概念是什么意思。一个对象的全部生命期中构造函数和析构函数执行的时机如下:1. 为对象分配空间。这个空间可能是在栈上(函数内的局部变量),可能是在数据区(静态变量、全局变量),也可能分配在堆上(new出来的变量)。2. 执行对象对应的构造函数。如果继承有父类或有成员对象,则先执行父类的构造函数和成员对象的构造函数。3. 对象生命期内的各种成员函数调用。4. 执行析构函数。和#2中构造的过程相反,先执行自身的析构函数,再执行父类和成员对象的析构函数。5. 释放为对象分配的空间。这个过
阅读全文
摘要:(转载请注明原创于潘多拉盒子)Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无。然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题。其实,除了效率,inline函数还提供了另外一个便利:可读性。当一个函数比较小,比如只有一个return语句,那么把实现和声明分开不是一个很好的办法。比如如下的一个成员函数:class List{public: size_t getSize() const { return _size; } private: size_t _size; };如果将其中的getSize()函...
阅读全文
摘要:(转载请注明原创于潘多拉盒子)一本典型的C语言教科书的厚度大约是200页左右,而一本典型的C++教科书的厚度至少要500页。比如K&R的《The C Programming Language》的厚度是272页,而权威性于此大致相当的Stroustrup的C++教科书《The C++ Programming Language》的厚度是1019页,后者是前者的3.75倍。这给C++工作者带来了沉重的负担,纯记忆这些内容就已非易事,能深入理解则消耗更多的实践,如果想把C++的每一个特性熟练恰当的运用,则近乎天方夜谭。这源于C++的特性之复杂。为了在底层上兼容C并保持较高的运行效率,C++尽管
阅读全文