RichardUSTC

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2013年3月29日

摘要: 这篇文章对C++的overload、override和overwrite有一个详细的介绍。Java与C++有些不同。例如,父类实现了func()和func(int x),子类继承父类之后只实现func()。C++中,子类的对象无法调用func(int x),而Java中,子类的对象可以调用父类的func(int x)。C++中也可以用using语句来实现类似Java的效果。class Base{ void foo(){...} void foo(int){...}};class Derived:public Base{ using Base::foo; void foo... 阅读全文
posted @ 2013-03-29 20:00 RichardUSTC 阅读(179) 评论(0) 推荐(0) 编辑

摘要: 1. C++继承语法class Derived [: [private|protected|public] Base1, ...]如果没有指定private、protected或public,则默认是private继承。如果是用struct来定义类,那么默认就是public继承。使用这里的private、protected和public是用来控制Derived类的对象和子类对Base1等父类的成员的访问,而Derived类内部对与Base1等父类的成员的访问则只受父类的控制。2. C++支持多重继承,但是这样容易出现菱形继承,容易产生歧义。关于菱形继承,这一有一篇文章可以参考。3. C++中, 阅读全文
posted @ 2013-03-29 18:18 RichardUSTC 阅读(188) 评论(0) 推荐(0) 编辑

摘要: 虚函数语法形式class Foo{ ... virtual void func(); ...};C++虚函数必须和C++的继承结合起来一起看。示例是最好的解释。#include <iostream>using namespace std;class Base{ public: void func1(){ cout<<"I'm Base func1"<<endl; } virtual void func2(){ cout<<"I'm Base func2"<<endl; }... 阅读全文
posted @ 2013-03-29 10:51 RichardUSTC 阅读(274) 评论(0) 推荐(0) 编辑

2013年3月21日

摘要: 在很多开源项目中,作者喜欢用宏定义以及预处理中的拼接技术来生成一些函数。比如,在QEMU的源码中就使用这种方式来定义函数// file1#define xglue(x, y) x ## y#define glue(x, y) xglue(x, y)// file2#define HELPER(name) glue(helper_, name)// file3uint32_t HELPER(clz)(uint32_t x){ return clz32(x);}其实最终的效果就是定义了uint32_t helper_clz(uint32_t x){ return clz32(x)... 阅读全文
posted @ 2013-03-21 17:30 RichardUSTC 阅读(1549) 评论(0) 推荐(0) 编辑

2013年3月20日

摘要: 前段时间好奇心起,研究了一下多看的推送系统。多看的推送其实使用邮箱来完成的。比如我在爱看豆网站上推送一本书到多看系统,爱看豆的后台会自动给在我在网站上设置的多看邮箱里发送一封邮件,并将这本书作为附件。kindle上的多看系统联网的时候,会自动检查我的多看邮箱中是否有邮件,如果有,则下载其附件,放在多看推送目录下。前两天研究多看系统的时候在系统的log里面发现了多看推送系统的pop3登录用户名和密码,估计是程序员为了调试方便不小心输出的。这两天无线路由器不在,没有办法用kindle接收多看的推送。于是我想起了用Gmail来接收多看邮箱的邮件。设置过程就不多说了,按照Google的提示来就行了。设 阅读全文
posted @ 2013-03-20 23:03 RichardUSTC 阅读(375) 评论(0) 推荐(0) 编辑

2013年3月19日

摘要: 通常来说,需要实现析构函数的类都需要实现拷贝构造函数和拷贝赋值。如果没有实现自定义的拷贝构造用函数和拷贝赋值,那么编译器会自动实现它们。在编译器的实现里,如果成员是builtin类型,那么就直接赋值,如果是类类型的,那么就会调用类的相应函数来实现。特别要注意的是,如果是指针,那么只拷贝指针的值,即使是类指针类型也不例外。这就是所谓的浅拷贝。这里有一篇文章Shallow vs. deep copying介绍地更详细。拷贝构造函数拷贝构造函数的形式class Foo{ Foo(); Foo(const Foo&);};拷贝构造函数的参数一般是const限定的引用,也可以使用非const.. 阅读全文
posted @ 2013-03-19 23:09 RichardUSTC 阅读(415) 评论(0) 推荐(0) 编辑

2013年3月17日

摘要: 在看C++ Primer的过程中,发现C++11标准中添加了lambda和类型推断系统。这篇文章介绍了很多lambda的实例。为了弄清楚lambda的实现,特地做了一个小实验。这一次只看non-mutable lambda。测试的gcc版本为4.6.3(貌似4.5以前的gcc不支持lambda表达式)。代码: 1 //test.cpp 2 #include <iostream> 3 template<typename Func> 4 void test(Func f){ 5 std::cout<<f(3)<<std::endl; 6 } 7 te 阅读全文
posted @ 2013-03-17 18:07 RichardUSTC 阅读(1527) 评论(0) 推荐(0) 编辑

摘要: C++中将算法和容器进行了很好的分离。容器用来存储数据,仅仅提供一些基本的操作,而算法则做到跟底层的数据结构无关。联系容器和算法的关键是迭代器。算法不会更改容器的大小,但是也有一些特殊情况,执行过算法之后容器的大小改变了。但是要注意的是,改变容器大小的不是算法,而是迭代器。比如,这里有一个back_inserter的例子。unique算法是去掉容器中重复的元素,执行unique完算法之后,会返回一个新的指向容器末尾的迭代器,程序员需要自己手动删除新尾到原尾之间的元素。使用算法的时候需要注意的是算法一般不会对容器的大小、迭代器是否有效进行检查,这些都需要程序员在调用算法之前自己检查。C++标准库 阅读全文
posted @ 2013-03-17 15:45 RichardUSTC 阅读(221) 评论(0) 推荐(0) 编辑

2013年3月15日

摘要: QEMU是一个支持跨平台虚拟化的虚拟机,有user mode和system mode两种配置方式。其中qemu在system mode配置下模拟出整个计算机,可以在qemu之上运行一个操作系统。QEMU的system mode与常见的VMware和Virtualbox等虚拟机比较相似,但是QEMU的优势是可以跨指令集。例如,VMware和Virtualbox之类的工具通常只能在x86计算机上虚拟出一个x86计算机,而QEMU支持在x86上虚拟出一个ARM计算机。qemu在user mode配置下,可以运行跟当前平台指令集不同的平台可执行程序。例如可以用qemu在x86上运行ARM的可执行程序, 阅读全文
posted @ 2013-03-15 13:00 RichardUSTC 阅读(10397) 评论(0) 推荐(0) 编辑

2013年3月14日

摘要: 继续之前的C++复习笔记。顺序容器中放置的元素不能是引用或者不可复制的对象(比如输入输出流对象)。C++中的顺序容器有vector、deque、forward_list。在复习这一部分的时候,遇到了C++中的adaptor的概念。adaptor在用已有的类(函数、迭代器)为基础,创造出另一种不同功能的类(函数、迭代器)。例如stack<int, vector<int> > s;里面的stack类使用vector作为基础数据结构,利用vector的成员函数包装出back(), push_back()和pop(),实现栈功能。C++中的顺序容器:1. vector2. de 阅读全文
posted @ 2013-03-14 21:08 RichardUSTC 阅读(162) 评论(0) 推荐(0) 编辑