摘要:
任正非说,”让一线直接呼唤炮火“。把一家小公司做大很难,然而更难的是如何把一家大公司做小。大公司里人多、事情多、角色多、关系多、会多。管理者是管理全局的(可能是局部),从管理者的角度来看会议是重要的,这是一个上传下达,沟通信息的渠道;会议上的大部分信息都是有用的。从员工(工程师、设计师)的角度来看,... 阅读全文
摘要:
(转载请注明原创于潘多拉盒子) 智能指针(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++尽管 阅读全文
摘要:
其实无论你用什么语言来编程,都面临一个很现实的问题:命名。编程就像写小说,创造的是一个逻辑的世界,这个世界是由概念,规则,概念之间的相互作用来实现软件所定义的功能。要说写小说,关键的是那些名字,比如“东方不败”,“李莫愁”,“田伯光”,这些名字不是随便起来的,而是和这个世界有着深刻的联系。其实理论上讲,一个程序可以完全由无现实意义的abcd或者甲乙丙丁编写,因为一个程序实际的功能,是由实体的类型和它们之间的关系来保证的(这里就不论证了,呵呵)。但是,正如某大师所说,程序主要是给人看的,是和人交流的,只是偶尔需要编译和运行。而人的思维对现实的实体的理解最为深刻,因此如果能借助现实来理解程序,那么 阅读全文
摘要:
(转载请注明原创于潘多拉盒子)C++的模板可以帮助我们编写适合不同类型的模板类,给代码的复用性提供了极大的方便。近来写了一个涉及单例的C++模板类,简化下来可以归结为以下的代码:template class Singleton{public: // 此处省去了多线程安全锁 static T* getInstance() { static T t; return &t; }}; 那么如果希望对某个work horse类,比如叫做Foo,定义一个Singleton,就会很容易啦:Foo* foo = Singleton::getInstance(); 注意这里不需... 阅读全文
摘要:
(转载请注明原创于潘多拉盒子)Linux man pages的缺点就是,如果你不会用某个命令,那么看完了多半还是不会。原因是,没有例子!比较囧吧?sort是提供了多列排序的功能的。通过-k选项,可以搞出来若干个排序列组,每个组内按照指定的原则排序,优先级从高到低。比如一个文件内容如下:Tom Mathematics 95Jack Mathematics 99Tom Physics 78Jack Physics 65如果想将同一个名字的不同科目的分数按从高到低排列起来,那么就是sort -k1,1 -k3nr,3是不是很神奇呢?每一个-k选项指定了一个排序列组,逗号左边的数字是起... 阅读全文