随笔分类 -  C++

摘要:如果把拷贝构造函数和赋值函数都设成private private: ClassName(const ClassName & name); ClassName& operator=(const ClassName &name); 那么会出现下面的情况: 阅读全文
posted @ 2017-02-28 16:03 blcblc 阅读(170) 评论(0) 推荐(0) 编辑
摘要:注意,构造函数不能是虚的,不然不会生效?(构造函数里面调用虚的函数,也不会生效)。 而虚构造函数,指的是通过一个虚函数,来调用clone方法,生成一个新的实例。而这个clone里面,一般调用的是拷贝构造函数。 return new ChildClass(*this); 返回 ChildClass* 阅读全文
posted @ 2017-02-28 15:37 blcblc 阅读(193) 评论(0) 推荐(0) 编辑
摘要:把子类指针转为父类指针后,用==是能够相等的。因为编译器做了处理。 而如果同时两个父类,相互比较是不等的,因为彼此没有继承关系。是否可以用dynamic_cast来处理? 如果转为 void* 那么是不等的。因为丢失了类的信息。 阅读全文
posted @ 2017-02-28 15:27 blcblc 阅读(193) 评论(0) 推荐(0) 编辑
摘要:在C++里面,dynamic_cast 通常用于横向转换,而不是向上或者向下的转换。 这个常常用于检查某个实例,是否实现了某个接口类,那么就把这个实例,用dynamic_cast来转换成这个接口类的实例。 如果成功,那就得到了调用方;如果不成功,会返回NULL. 一般不用引用来作为转换的接收方,因为 阅读全文
posted @ 2017-02-28 13:40 blcblc 阅读(199) 评论(0) 推荐(0) 编辑
摘要:也就是会根据实参,所处在的名字空间,来查找对应名字空间里面的函数。 对于<<也是常见的场景,会根据实际要打印出来的下一个操作数,来决定调用哪个命名空间里面的函数。 注意,不同命名空间里面的函数,不构成重载的关系。它们只是在调用的时候,会被不同的选择而已。 对于操作符,比如%,同时存在成员函数和非成员 阅读全文
posted @ 2017-02-28 13:00 blcblc 阅读(185) 评论(0) 推荐(0) 编辑
摘要:1. 找备选函数; 2. 找参数匹配的函数; 3. 检查权限,看是否private什么的。 也就是说,如果子类有一个private的函数,就不会去访问父类正常的函数。 另外,对于变量也是一样的,同名的变量,会导致不能访问父类正常的函数。 阅读全文
posted @ 2017-02-28 01:14 blcblc 阅读(159) 评论(0) 推荐(0) 编辑
摘要:可以用Command模式、函数对象来代替函数指针,获得以下的好处: 1. 可以封装数据 2. 可以通过虚拟成员获得函数的多态性 3. 可以处理类层次结果,将Command与Prototype模式相结合,获得更多的便利。 阅读全文
posted @ 2017-02-27 23:04 blcblc 阅读(271) 评论(0) 推荐(0) 编辑
摘要:异常安全的赋值 需要注意,复制赋值和复制构造,相兼容。 赋值时候,要带上自检查。 阅读全文
posted @ 2017-02-27 18:38 blcblc 阅读(213) 评论(0) 推荐(0) 编辑
摘要:有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移。 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的。因为父类的对象中,不一定包含子类对象的结构。 注意前面的 Class::* 这样的操作符。赋值也是用 &Cla 阅读全文
posted @ 2017-02-27 18:36 blcblc 阅读(330) 评论(0) 推荐(0) 编辑
摘要:今天在这里面看到了这个题目,据说还是Google面试题。 http://www.cnblogs.com/chio/archive/2007/10/23/934335.html 总的思想,是把一些在栈上或者堆上面创建对象,所必须的函数设为private使得编译报错。 比如: 只能在堆上创建,不能在栈上 阅读全文
posted @ 2017-02-27 17:48 blcblc 阅读(284) 评论(0) 推荐(0) 编辑
摘要:再让我们看看<signal.h>中声明的signal函数void (*signal(int, void(*)(int)))(int)首先,用typedef简化,typedef void (*handler_type)(int)得,void (*signal(int, handler_type))(i 阅读全文
posted @ 2017-02-27 17:16 blcblc 阅读(493) 评论(0) 推荐(0) 编辑
摘要:最后,总结一下关于虚函数的一些常见问题:1) 虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数。这是虚函数的基本功能,就不再解释了。 2) 构造函数不能是虚函数。而且,在构造函数中调用虚函数,实际执行的是父类的对应函数,因为自己还没有构造好, 阅读全文
posted @ 2017-02-27 17:01 blcblc 阅读(545) 评论(0) 推荐(0) 编辑
摘要:mutable的使用场景: 可以在一个const的对象里面,解除对部分字段的const限制。也可以用在const成员函数里面。 对于const与否,一般会调用不同版本的函数: 而对于二元操作符,如果用成员函数定义,那么加上const修饰符,就可以使得左侧也是const。 阅读全文
posted @ 2017-02-27 15:45 blcblc 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2017-02-27 12:17 blcblc 阅读(168) 评论(0) 推荐(0) 编辑
摘要:注意,对于多维数组的情况。 阅读全文
posted @ 2017-02-27 00:45 blcblc 阅读(434) 评论(0) 推荐(0) 编辑
摘要:https://leetcode.com/problems/trapping-rain-water https://leetcode.com/problems/trapping-rain-water-ii 这两道题目,一个是一维,一个是二维。都很经典。 基本的做法,可以看这里: https://di 阅读全文
posted @ 2017-02-26 22:19 blcblc 阅读(1161) 评论(0) 推荐(0) 编辑
摘要:刚刚那道BST的题目,也用到了priority_queue,那是那个没有定义比较函数。 那么下面这个,就要定义比较函数。 它的模板声明带有三个参数,priority_queue<Type, Container, Functional> struct cmp{ bool operator() ( No 阅读全文
posted @ 2017-02-26 22:16 blcblc 阅读(679) 评论(0) 推荐(0) 编辑
摘要:递归,显而易见。 非递归,bfs,是用队列。 而前中后序,一般都是用栈。 一种很直观的方法是,采用一个flag,记录第几次进栈出栈,从而决定是否打印,决定下一个入栈的是左还是右子节点。 但是下面的方法,更近精简和巧妙。 https://discuss.leetcode.com/topic/30632 阅读全文
posted @ 2017-02-26 20:53 blcblc 阅读(322) 评论(0) 推荐(0) 编辑
摘要:https://leetcode.com/problems/data-stream-as-disjoint-intervals/?tab=Description 这道题目是合并间隔的经典题目。 https://discuss.leetcode.com/topic/46887/java-solutio 阅读全文
posted @ 2017-02-26 20:25 blcblc 阅读(1339) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示