摘要:
最近刚装了新系统CentOS7,想要把编码环境配置一下,使用Vim编写程序少不了使用自动补全插件,我以前用的是neocomplcache+code_complete+omnicppcomplete。但在网上搜索时,看到了YouCompleteMe,说YCM更好用一些。个人也喜欢新鲜事物,故决定安装Y... 阅读全文
摘要:
现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。本文以在Redhat Linux安装GCC4.9.2为例(因在项目开发过程中要求使用,没有用最新的GCC版本),介绍Linu... 阅读全文
摘要:
http://www.programcreek.com/2012/12/%E9%9D%A2%E8%AF%9510%E5%A4%A7%E7%AE%97%E6%B3%95%E6%B1%87%E6%80%BB%EF%BC%8B%E5%B8%B8%E8%A7%81%E9%A2%98%E7%9B%AE%E8%A7%A3%E7%AD%94/英文版的面试10大算法汇总日最高访问量已高达4,318次。这说明总结程序员面试算法有实际意义,比读算法书更有效。下面是中文版的10大算法汇总+有代表性的题目汇总。这些概念是专门为面试准备的,因为日常编程中我们很少会自己去写一个链表或者做一个图,也不会经常使用没有效率的递 阅读全文
摘要:
请牢记:以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露。假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:int priority(); //处理程序优先权的函数void processWidget(std::tr1::shared_ptr pw, int priority);//该函数在动态分配所得的Widget上进行某些带有优先权的处理。调用:processWidget(new Widget, priority()); //编译不过!该构造函数是expli... 阅读全文
摘要:
请牢记:如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。 new[] 对应 delete[]如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[]。 new 对应 delete当使用new时(即通过new动态生成一个对象),有两件事发生:第一,内存被分配出来(通过名为operator new 的函数);第二,针对此内存会有一个(或更多)构造函数被调用。当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存之内 阅读全文
摘要:
请牢记:1、APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。2、对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。前面条款13的例子中使用了智能指针如auto_ptr或tr1::shared_ptr保存createInvestment的调用结果:std::tr1::shared_ptr pInv(createInvestment()); 假如某个API希望以某个函数处理Investment对象,返回投资天数,如下:int dayHeld(const Investment* pi); //返回投. 阅读全文
摘要:
请牢记:1、复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。2、普遍常见的RAII class copying行为是:抑制copying、施行引用计数法。不过其他行为也可能被实现。auto_ptr和tr1::shared_ptr的观念表现在heap_based资源上。然而并非所有资源都是heap_based,对于非heap_based资源而言,需要建立自己的资源管理类。假设我们使用C API函数出来类型为Mutex的互斥器对象(mutex objects),共有lock和unlock两个函数。void lock(Mutex* pm) 阅读全文
摘要:
所谓资源就是,一旦使用了它,将来必须还给系统。C++最常使用的资源就是动态分配内存(如果分配了内存却不释放,会导致内存泄露),但内存只是必须要管理的众多资源之一。其他常见的资源还包括文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字型和笔刷、数据库连接、以及网络sockets。不论哪一种资源,重要的是,当不再使用它时,必须将它还给系统。假设我们使用一个用来模拟投资行为(例如股票、债券等)的程序库,其中各式各样的投资类型继承自一个root class Investment:class Investment{ ... //"投资类型" 阅读全文
摘要:
设计良好的面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝,即copy构造函数与copy assignment操作符。编译器会在必要的时候为类创建coping函数,并说明这些“编译器生成版”的行为:将被拷贝对象的所有成员变量都做一份拷贝。任何时候,只要自己实现派生类的copying函数,则必须很小心的复制其基类成分。这些成分往往是private私有的,故无法直接访问它们,因此应该让派送类的coping函数调用相应的基类函数:void logCall(const string& funcName); class Customer { public: ... Customer. 阅读全文
摘要:
“自我赋值”发生在对象被赋值给自己时:class Widget{ ...};Widget w;...w = w; //赋值给自己operator=,不仅不具备“自我赋值安全性”,也不具备“异常安全性”。让operator= 具备“异常安全性”往往自动获得“自我赋值安全性”的回报。因此越来越多的人对“自我赋值”的处理态度是不去管它,而把焦点放在实现“异常安全性”上。确保代码不但“异常安全”而且“自我赋值安全”的一个替代方案是,使用所谓的copy and swap技术。此技术和“异常安全性”有密切关系,它是一个常见而够好的operator=撰写办法,其实现方式为:class Widget{pub. 阅读全文