Why am I getting an error converting a Foo** → const Foo**?
摘要:Because converting Foo** → const Foo** would be invalid and dangerous.C++ allows the (safe) conversion Foo* → Foo const*, but gives an error if you tr...
阅读全文
The constness of a method should makes sense from outside the object
摘要:C++的encapsulation机制使得我们可以使得一个类的逻辑接口和内部表示有很大的差异,比如下面这个矩形类:class Rectangle{public: int width() const {return x;} int height() const {return y;} ...
阅读全文
Virtual Friend Function
摘要:一般而言,友元作为一种紧耦合的设计,被视作类的一部分。一个经典的应用就是关于类的序列化和反序列化。class A{ friend ostream& operator<<(ostream& os, const A& a);private: int i;}ostream& operator<...
阅读全文
C++ offsetof
摘要:这是一个宏,用于计算类中某个成员的地址相对于类实例的偏移量在C++11中,要求这个类standard_layout基本用法是这样子的:#include /* printf */#include /* offsetof */struct foo { char a; c...
阅读全文
C++11 std::copy
摘要:这个函数并不是简单的while(first != last){ *result = *first; result++; first++; }事实上这种写法是最具普适性的,值要求inputIterator是输入迭代器,outputIterator是输出迭代器可以想像我们熟悉...
阅读全文
C++11 move_iterator
摘要:template class move_iterator { Iterator current; public: typedef Iterator iterator_type; typedef typename std::iterator...
阅读全文
return, exit, _exit的区别
摘要:return是返回的最常用的方式_exit属于POSIX定义的系统调用exit是GLIBC封装之后的函数1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装exit函数的时候加了一些功能:比如提供了在结束程序时回调的接口(atexit), flush 缓冲区(系统调...
阅读全文
metaprogramming笔记
摘要:动态多态与静态多态动态多态:允许我们通过单个基类指针或引用处理多个派生类型的对象. 模板元编程中强调静态多态,允许不同类型的对象以同样的方式被操纵,只要它们支持某种共通的语法即可.动态多态,连同"延迟绑定"或"运行期派发",是面向对象程序的关键特性.静态多态(也称参数化多态),是泛型编程的本质要素....
阅读全文
C++中的数组与指针
摘要:数组与指针看起来很像int a[] = {1, 2 ,3};int *p = a;如此,我们可以p[0], p[1], p[2]看起来,与直接使用数组名没什么两样,但是看这段代码sizeof(a)sizeof(p)你就会知道,原来数组里还隐含了大小信息,这是指针所不能做到的严格的说,数组是一种内置的...
阅读全文
C++语法疑点
摘要:1函数模板不支持偏特化2类内部的typedef 必须放在最前面,不然没法用: 疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕之后的.3const vs nonconst member function 注意成员函数的cons...
阅读全文
为什么需要定义虚的析构函数?
摘要:本来C++继承机制已经保证了构造和析构过程都会自动调用基类的对应部分的class Base{public: ~Base(){ cout doSomeThing(); delete d;}一切都工作得很好,直到有一天,你学习了设计模式,明白我们要面向接口编程,而不是面向实现编...
阅读全文
C++ shared_ptr deleter的实现
摘要:#include #include using namespace std;#includeclass sp_base{public: virtual void del(void* obj) = 0; void inc_ref(){ ref_count_++; } ...
阅读全文
C/C++ 字符串 null terminal
摘要:在C/C++中,字符串以'\0'结尾是一种强制要求,或者说,只有满足这个要求的字符数组才能被称为字符串。否则,你所做的所有操作结果都是未定义的!C标准库string.h中所有关于字符串的函数都有一个特性,对于输入字符串,默认为是以'\0'结尾的,否则就会出现未定义行为,比如strlen,实现就依赖了...
阅读全文
C++ inline weak symbol and so on
摘要:关于inline这个关键字,听到强调得最多的是,它只是一种对于编译器的建议,而非强制执行的限定。但事实上,即使这个优化最终由于函数太过复杂的原因没有达成,加上inline关键字(还有在类定义中直接定义的函数也相当于加上了inline关键字)还是会带来一些区别的。参看C++11标准文档里面的描述:A ...
阅读全文
ISO c++11 does not allow conversion from string literal to 'char*'
摘要:http://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char
阅读全文
STL中的lower_bound和upper_bound的理解
摘要:STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置upper_bound表示的是第一个大于给定元素的位置。譬如,值val在容器内的时候,从lower_bound到 upper_bound表示的就是整个容器中与val相等的元素的位置了
阅读全文
leetcode 221 Maximal Square
摘要:这题使用动态规划,基本想法是建立一张表table,table[i][j]就标志以点(i, j) 为右下角顶点的正方形最大边长,显然,可以通过table[i - 1][j - 1]来得到table[i][j]的值(正方形,只需要考虑对角的方向)。class Solution {public: i...
阅读全文
LeetCode222 Count Complete Tree Nodes
摘要:对于一般的二叉树,统计节点数目遍历一遍就可以了,但是这样时间复杂度O(n),一下就被卡住了。这题首先要明白的是,我们只需要知道叶子节点的数目就能统计出总节点树。想法1: 既然是完全二叉树,我肯定是从左子树开始看,如果左子树不完整,右子树就不用再遍历了。由此形成一个递归的搜索过程,先搜索左子树,如果...
阅读全文