Effective C++编程
记录《Effective C++ 中文版 第二版》、《Effective C++中文版 第三版》、《More Effective C++中文版》。以及自己经常看到的一些使用技巧。
有时需要偏执狂
一定要搞懂,千万不要心存侥幸,否则一些问题会让你痛苦不堪(源码面前,了无秘密)。
拥有一某三分地不容易,贵在坚持。
展开
-
Lazy Evaluation
1、引用计数 M29 2、区别对待读取和写入 M30 3、Lazy Fetching(懒惰提取) 4、懒惰表达式计算原创 2018-04-02 21:10:08 · 458 阅读 · 0 评论 -
区分接口继承和实现继承
这里主要是理解基类中声明为纯虚函数、虚函数、和非虚函数的区别,主要是为了告诉派生类什么信息呢?原创 2018-03-22 17:02:15 · 325 阅读 · 0 评论 -
C++虚函数要点合集
参考: https://blog.csdn.net/lihao21/article/details/506883371、动态类型与静态类型静态类型:指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。 动态类型:基类的指针和基类引用有可能为动态类型,就是...原创 2018-04-03 22:09:15 · 540 阅读 · 0 评论 -
malloc/free与c++中new/delete、operator new/operator delete与placement new的区别?
malloc/free与new/delete相同点 二者都可以从堆中申请和分配动态内存,并且二者都必须成对匹配使用。new/delete和malloc/free必须配对使用,才可以正确完成内存的的申请和释放功能。不同点malloc/free是标准库里面的函数,只能用于分配内部数据类型(int char等等)。void * malloc(size_t size)原创 2018-01-14 17:15:02 · 718 阅读 · 1 评论 -
C++给类实现内存池的功能
1、为什么需要重写operator new 和operator delete 默认的operator new 具有很好的通用性,可以分配任意大小的内存块。operator delete也可以释放任意大小的内存块。为了让operator delete弄清楚需要释放多大内存,通常会在operator new分配的内存块里附带一些额外信息,用来指明被分配内存块的大小,所以分配内存的大小实际比存储原创 2018-02-02 00:44:17 · 1028 阅读 · 1 评论 -
初始化列表问题
1、多多使用初始化列表进行初始化const和引用数据成语只能初始化,不能被赋值对于含有基类的类,基类构造函数总是被调用。当有大量的固定类型的数据成员需要初始化的时候,可以使用在构造函数体内铜鼓赋值初始化,简化设计。templateclass T>class NamedPtr {public: NamedPtr(const string& initName, T *i原创 2018-02-05 11:33:37 · 339 阅读 · 0 评论 -
C++多态及虚析构函数
14、M24、M26、33、35和M33、36 http://blog.csdn.net/lihao21/article/details/50688337 http://blog.jobbole.com/103102/C++实现多态 多态:支持相关的对象具有不同的成员函数(但原型相同) ,并允许对象与适当的成员函数进行运行时绑定。虚表和虚表指针介绍 当调用一个虚函数时...原创 2018-02-10 22:13:55 · 412 阅读 · 0 评论 -
赋值运算符重载(operator=)注意事项
1、返回*this引用类中定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用( *this)。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行,或两种情况同时发生。string& operator=(const string& rhs)//string赋值运算符一种形式{ return *this;}string w, x, y, ...原创 2018-02-27 11:10:03 · 3937 阅读 · 0 评论 -
类设计与声明之实现用户自定义下标上下限的数组
占楼。。设计并技术高效编程的规则。原创 2018-02-27 16:36:59 · 363 阅读 · 0 评论 -
类设计与声明之实现有理数类
占楼,学习并设计规则。 http://blog.csdn.net/qq_38238112/article/details/77416146 http://blog.csdn.net/chenkangli/article/details/489725 https://www.cnblogs.com/laizhenghong2012/p/8457784.html http://blog.csd...原创 2018-02-27 16:37:52 · 2426 阅读 · 0 评论 -
类设计与声明之实现string类
占位,实现简单的mystring,结合高效编程。 http://blog.csdn.net/yusiguyuan/article/details/45816531原创 2018-02-27 19:51:08 · 1044 阅读 · 0 评论 -
避免对指针和数字类型重载以及潜在的二义性
指针和数字类型都是数字,避免重载两种类型,否则可能产生不可避免的麻烦。原创 2018-02-27 20:07:58 · 303 阅读 · 0 评论 -
尽量用const、inline、enum代替宏定义
1、宏定义发生在预处理阶段采用符号直接替换原则。当设计这方面代码出错,有时候会令人费解。所以在C++里面尽量通过const和inline代替定义常量的宏定义。#define PI 3.1415const double PI = 3.1415;//代替上述define2、定义常量指针const char * const myname = "wang";//myname的数值和指原创 2018-02-01 12:25:59 · 1452 阅读 · 1 评论 -
new失败如何处理
需要搞清楚空间配置器之前必须分清楚C++中各种内存分配和释放的区别?这里的问题就是当new分配内存失败该怎么办?现在讨论的方法,在STL内存分配中使用了很多。 new是通过调用对应的operator new产生的内存,并且operator new可以重载。C++采取的做法就是通过new-handler回调函数处理。当operator new不能满足分配需求时候,在抛出对应异常之前会调原创 2018-02-01 20:50:26 · 3564 阅读 · 0 评论 -
动态分配内存的类定义拷贝构造函数和赋值运算符、C++幕后所做的事情以及禁止这些
1、C++编译可能默认生成一些函数 通过它的时候。如果自定义类没有声明下列函数,C++编译器会声明自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。class Empty{};//等同于以下class Empty {public: Empty();//缺省构造函数原创 2018-02-02 20:53:27 · 1034 阅读 · 1 评论 -
指针和引用
1、引用引用必须初始化 引用就是给对象取一个别名。定义引用,程序把引用和它的初始值绑定在一起(绑定之后不可再绑定其他对象),而不是初始值拷贝引用,为了完成对应的绑定,引用必须初始化。引用类型必须和绑定对象类型严格匹配。操作引用 引用赋值,就是把值赋给了与引用绑定的对象。获取引用值,实际上就是获取了与引用绑定对象的值。引用必须指向某个固定对象,之后不可修改 首先引用并不是对象,所以不原创 2018-02-02 21:17:31 · 984 阅读 · 0 评论 -
C++中const的重要性
const1、通过const你可以通知编译器和某些程序员某个值要保持不变,然后编译器具体实施这种约束。对于指针可以使用双重const。 2、让函数返回一个常量值,可以减少用户的出错几率。const A operator*(const A &lhs , const A &rhs);//参数const引用,告知此函数不可修改原对象//返回const对象,告诉此对象不可...原创 2018-02-03 12:22:11 · 502 阅读 · 0 评论 -
C++中临时对象产生
临时对象 临时对象是看不见的,它们不出现在你的源代码中。在栈上建立一个没有命名对象叫做临时对象。临时对象产生和释放都会对应构造函数和析构函数的调用。一切都是函数的调用而已。1、为了使得函数调用成功产生临时对象 仅当通过传值方式和传递常量引用参数时,才可能发生类型转换。传递非常量引用不会发生。区别以下例子size_t countChar(const string &str原创 2018-02-03 19:54:30 · 1982 阅读 · 0 评论 -
类型转换及类型转换函数
所以类型转换,就是为了告诉编译器这部分内存,应该用什么方式去解释它,如何组织这段内存。1、C风格类型转换 c语言比较熟悉,指针类型的转换很常见。通过圆括号和标识符组成(type) expression。允许任何类型之间的转换过于粗鲁并且在程序语句中难以识别(主要是人工阅读代码可能难以分辨而已,因为C++语法复杂)。所以c++定义了四种类型转换,解决上述缺点。2、C++风格原创 2018-02-03 21:31:05 · 5648 阅读 · 0 评论