- 博客(60)
- 资源 (24)
- 收藏
- 关注
原创 c实现内存文件系统
华为软件训练营的一个高级练习题,比较有意思,值得练习一下! 题目不是很难,主要是考察一下几个知识点: (1)数据结构中树的操作,包括树的定义、树的遍历、节点的插入和删除,这里采用了带双亲的孩子兄弟表示法,实际上可以转换为二叉树,可以采用中序遍历的方式访问树的节点。 (2)内存管理。树节点中存放有树的信息,在每次插入一个新节点的时
2014-03-06 20:46:42
2432
原创 C++”前置声明“那些事儿
今天在研究C++”接口与实现分离“的时候遇到了一个问题,看似很小,然后背后的东西确值得让人深思!感觉在学习的过程中有太多的为什么,而每一个为什么背后都隐藏着一些原理和目的,所以得多问自己”为什么“,这样才不仅知其然,更知其所以然,才能举一反三、融会贯通,这也是我以前学习不够重视的一个问题,好在”亡羊补牢,犹未晚也!“。 C++中将”接口与实现分离“的两个重要目的就是”降低文件间的
2013-11-28 14:47:05
1689
3
转载 C++的”接口与实现分离“实现方法
让我们从stackoverflow上一个同学的问题来开始。问题的原型是这样的(原问题见:class member privacy and headers in C++):Portaljacker:“有一个类A, 有一些共有成员函数和私有数据,如下所示。” class A { public: X getX(); Y getY(
2013-11-27 16:04:52
2343
7
原创 《Effective C++》之异常安全性和异常安全函数
本篇文章是在学习“《Effective C++》item29:为“异常安全”而努力是值得的”的一个总结,主要介绍C++的异常安全性和异常安全函数。一个函数如果说是“异常安全”的,必须同时满足以下两个条件:1.不泄漏任何资源;2.不允许破坏数据。为了让代码具有更好的异常安全性,首先是”用对象来管理资源“,以避免资源的泄漏。其次,在异常安全性等级上,应该尽可能地往更高的等级上来限制。通过 copy-and-swap 方法往往可以实现”强烈保证“。但是我们也应该知道,”强烈保证“并不是对所有的情况都可实现,这取决
2013-11-25 16:25:46
2768
原创 《Effective C++》item28:避免返回handles(即:Reference、指针、迭代器)指向对象内部成分
避免返回handles指向对象的内部(主要是对象的数据成员有其他类对象)。遵守这个条款可增加封装性(防止通过类的public接口修改对象的值),帮助const成员函数更加像一个const(通过handle间接修改const常量的内部值),并将“虚号码牌“的可能性降低到最低(handle指向一个已经析构了的对象)。
2013-11-24 07:09:51
1518
原创 《Effective C++》item25:考虑写出一个不抛异常的swap函数
std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如:[cpp] view plaincopyprint?int main(int argc, _TCHAR* argv[]) { int a[10] = {1,2,3,4,
2013-11-22 15:07:49
1370
原创 C++转换构造函数和隐式转换函数
今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数、拷贝构造函数、析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服! 其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转
2013-11-18 14:30:44
3798
2
原创 《Effective C++》item11:在operator=中处理“自我赋值”
“自我赋值”是个看似不可能但却又让人望而生畏的东西,貌似几乎不会有人写出 Point p; p = p; 这样的二逼程序,虽然不会出现编译错误,但确实是个能造成异常的语句!What‘s more,这样的“自我赋值”的机会并不少见,我们来看下面这个例子:#include "stdafx.h"#include using names
2013-11-16 12:55:44
1123
原创 一个编译错误引发的对default构造函数的调用时机的探讨
这是一个很容易让人迷惑的principle!按照我们对C++多态性的理解:定义基类中某个函数为虚函数是为了允许用基类的指针来调用子类的这个函数。通过virtual函数实现程序运行时候的动态调用。
2013-11-16 08:39:18
1481
2
原创 《Effective C++》item9:决不在构造和析构过程中调用virtual函数
这是一个很容易让人迷惑的principle!按照我们对C++多态性的理解:定义基类中某个函数为虚函数是为了允许用基类的指针来调用子类的这个函数。通过virtual函数实现程序运行时候的动态调用。 However,是不是只要在基类中使用了virtual函数就一定能够实现这种动态调用呢?是否只要在base class中定义了虚函数,那么在通过基类指针指向子类的时候就一定会调用子类实现
2013-11-15 15:13:24
1698
8
原创 由Point p1 = p和p1 = p的区别想到的关于copy构造函数和赋值操作符重载函数的调用时机问题
今天在论坛上看到一个帖子:http://bbs.csdn.net/topics/390642928?page=1#post-396087799,涉及到一个copy构造函数和赋值操作符重载函数的调用时机问题,更正了我一直以来的一个对着俩函数的理解上的误区,这个错误相信很多人都会犯过,随后我问了周围几个人,果然不出所料!特此记录,以飨读者! 首先看这样一个简单的程序,涉及到copy构造
2013-11-15 11:40:37
1499
原创 《Effective C++》item7:为多态基类声明virtual析构函数
(1)为什么要用虚函数?(2)为什么要定义virtual析构函数?(3)什么时候该定义virtual析构函数和什么时候不该定义virtual析构函数?
2013-11-14 21:41:42
2030
1
原创 《Effective C++》Item6: 如果你不想使用编译器生成的函数,就该明确拒绝!
通过对item5的学习我们知道:编译器会暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数。 but,有时候我们不希望我们的类有某些特定功能,通常的做法就是不声明具有这些功能的函数就可以了,however,对于某些与生俱来的功能——比如copy构造和copy assignment,即使我们不声明,系统也会自动生成。
2013-11-14 13:41:29
1294
1
原创 一个VC编译错误引发的对显示类型转换的思考(static_cast、dynamic_cast和const_cast)
error C2662: 'getY' : cannot convert 'this' pointer from 'const class point' to 'class point &' 的解决办法,以及对显示的类型转换static_cast、dynamic_cast、reinterpret_cast、和const_cast的探讨。
2013-11-13 16:31:45
2524
1
原创 《Effective C++》item5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls.)
阅读本条款内容又有了不少新的收获,虽然本条款比较简单。有些在以往学习c++的过程中一成不变的看法在这里得到颠覆!Questions:(1)空类真的是empty class吗?( Is empty class a empty body class?)(2)copy构造函数和copy assignment操作符?(3)在什么情况下编译器会拒绝为class生成operator=?
2013-11-13 14:46:03
1275
原创 《Effective C++》Item4:确定对象被使用前已先被初始化
Questions: (1)为什么需要在对象使用前初始化?(2)关于默认构造函数的几点认识?(3)为什么要使用参数初始化表进行初始化? ----------------------------------------------------------------------------------------------------------------------
2013-11-12 21:23:11
1353
2
原创 关于“error C2871: 'std' : does not exist or is not a namespace”和“Error spawning cl.exe“的解决办法
今天在使用VC6运行程序的时候出现了几个新的error,以前没有碰到,总结一下,希望对其他同学有帮助:1.Error spawning cl.exe 错误分析:这个error一般在点击“Compile”或者“Build”后出现的:“Compiling... ,Error spawning cl.exe”,“cl.exe”是VC使用的真正的编译器(编译程序
2013-11-12 12:40:44
2209
原创 《Effective C++》Item3:尽可能使用const
Answers:(1)const的使用场合有哪些?(2)const的规则?(3)const函数?(4)const STL迭代器?(5)const函数重载?--------------------------------------------------------------------------------------------->Questions:
2013-11-10 13:42:55
1097
1
原创 《Effective C++》Item2:尽量以const,enum,inline替换#define
1.为何要“以编译器替换预处理器”?2.何为“预处理器”?作用是什么?3.何为记号表(symbol table)?4.#define的缺陷和优势?5.const定义常量的好处?6.const定义常量需要注意的几个问题?7.inline相对#define和普通函数的优势?8.enum hack是什么东东?9.enum相对const和#define的优势?什么时候可以使
2013-11-10 08:36:46
1640
1
原创 多态与设计模式之我的理解
最近因为开发一个项目的关系在研究《Head First设计模式》,想从中找到一些灵感,虽然之前也看过,但是每次学习,都会有新的理解和感悟,非常感谢作者提供了这样一本让我受益匪浅的书! 面向对象程序设计(注意这里是面向对象,而不是基于对象)的一个很重要的设计原则就是:针对接口编程,而不是针对实现编程!可就是这样一句句很浅显的话,确包含了很多面向对象的知识在里面!
2013-01-15 17:58:05
1464
原创 Android4.0源码编译方法以及错误解决方案
历时一个星期,终于将android4.0源码编译成功,中间经历了各种曲折,非常之蛋疼,现在将编译方法共享一下: Android源码编译步骤:(基于ubuntu11.10和android4.0)1. 安装JDK2. 配置JDK环境变量gedit /etc/environment在打开的文件中,添加如下几行:PATH=$PATH:$JAVA_HOME/bi
2012-10-21 17:08:14
2206
1
原创 Android如何打开/关闭系统解锁服务?—典型错误分析
最近正在做一个Android的解锁应用,需要屏蔽系统解锁,并在适当的时候打开系统解锁,在网上search了很多有关系统解锁的资料,学到了很多关于系统解锁方面的知识,同时也发现了很多网友犯下的一个共同的错误。现分享一下: 错误一: 总所周知,要关闭系统自带的锁屏服务需要用到以下代码:mKeyguard = (KeyguardManager) getSystemSe
2012-09-03 23:15:43
9238
10
原创 C#解决MDI窗体闪屏的方法
最近从师兄手上接了一个C#的项目,需要用到MDI窗体,可是每当我显示子窗体的时候会有一次“闪烁”,很明显,看起来非常不爽,查找许久,知道是每次在show()子窗体的时候都会调用子窗体构造函数重绘窗体,其中需要将子窗体的尺寸调整到我在程序中设置的大小,无论我这样设置,这个窗口大小变化总会在show()的时候显示出来,我试过网上说的设置双缓冲、先隐藏窗体等启动之后再显示、借助定时器设置窗体的opaci
2012-06-14 20:18:40
7955
10
原创 C#将Excel数据表导入SQL数据库的两种方法
方式一:实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。using System;using System.Collections.Generic;using System.Componen
2012-06-05 12:09:51
7008
4
原创 [C#学习笔记之多线程2]多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
“线程同步”的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchronization)”。 线程同步的道理虽然简单,但却是给多线程开发带来复杂性的根源之一。当线程同步不好时,有可能会出现一种特殊的情形——死锁(Dead Lock
2012-05-31 23:05:20
10301
3
原创 [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数,也不能有返回值。如果希望传递参数给执行函数,则可以使用带参数的ParameterizedThreadStart委托, public delegate void ParameterizedThreadStart(Object obj)可以将要传送给
2012-05-21 12:32:23
11697
2
原创 [C#学习笔记之异步编程模式3]异步下载web网页
这是对上篇博文提到的IAsyncResult异步调用模式的一个实例应用,所用到的知识有:通过异步回调函数实现异步操作通过类实现给异步回调函数传递附加信息在子线程中通过异步回调的方式通知主线程执行结果WebRequest和WebResponse的操作using System;using System.Collections.Generic;using System.Linq;
2012-05-21 08:26:51
1912
原创 [C#学习笔记之异步编程模式2]BeginInvoke和EndInvoke方法
为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了。异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了。异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等
2012-05-20 14:36:40
7856
4
原创 [C#学习笔记之异步编程模式1]了解同步与异步
同步执行程序执行的流程是按照语句顺序执行,一句执行完再执行下一句,如果遇到函数调用,要等到函数调用返回以后才会执行下一句——这就是“程序的同步执行模式”。例 1:using System.Threading;using System;public class SynchroPattern{ public delegate int NewTaskDelegate(in
2012-05-20 11:09:53
1966
2
原创 C#内存映射文件学习
内存映射文件是由一个文件到进程地址空间的映射。 C#提供了允许应用程序把文件映射到一个进程的函(MemoryMappedFile.CreateOrOpen)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件
2012-05-17 17:10:35
7559
1
原创 使用剪贴板保存自定义对象
技术要点:放置到剪贴板上的对象必须是可序列化的。剪贴板接收一个实现了IDataObject接口的对象,可以用此对象“包装”具体的数据对象。可以多次调用IDataObject. SetData方法将多种类型的对象复制到剪贴板中。在获取剪贴板中的数据时通过DataFormat进行识别在进行粘贴之前,需要确保剪贴板上的数据是所需要的格式。using Sys
2012-05-14 12:00:24
1849
原创 [ACM]孤独的运货员
背景航空公司的货运飞机往返于各个国家和货物分理中心之间,分理中心的货物运送到各个国家,再将各个国家发出的货物送到分理中心。分理中心非常庞大,每个国家都有一个自己的货运站,每个货运站有两个平台用于堆放货物。其中 A 平台用于堆放运送到该国的货物,而 B 平台堆放着其它国家的货物。各个国家的货运站排成一个环形。平时,有货运汽车沿着环形的线路在各个国家的货运站之间运行。货运汽车的仓库是非常狭
2012-05-07 13:17:55
2691
原创 在scanf中使用正则表达式
[]内是匹配的字符,^表示求反集,当遇到非集合内的字符时立即终止输入 1. 输入指定范围的小写字母,遇到非法字符立即终止 scanf("%[a-z]",str1); printf("%s\n",str1); 输入:abc123 输出:ab //输入带空格的自定范围的字符串 scanf("%[a-z A-Z0-9
2012-05-06 10:24:35
2135
1
原创 [ACM]图形编辑器
原题见:http://acm.uva.es/p/v102/10267.html背景图形编辑器(graphical editor)允许用户改变位图图像,比如大家经常用到的Photoshop。它所采用的改变方法和文本编辑器允许修改文档的方法一样。位图图像由MxN的像素矩阵来表示,并且每个像素点都有给定的颜色。我们的任务就是来要编写一个程序来模拟一个简单的交互式图形编辑器。输入
2012-05-04 17:56:26
1403
原创 [ACM]穿越矩阵
现在有一个 m * n 的整数矩阵,请你编写一个程序计算出一条从左到右穿过矩阵的路径,并使此路径的费用最小。路径从矩阵的左侧的第一列的任意单元格开始,逐步穿过矩阵到达最右侧的一列的任意单元格。每一步是指从某单元格进入它一列的相邻单元格(如下图,可以是横向或斜向)。矩阵的第一行和最后一行实际是相邻的,你可以想象矩阵是包裹在一个横放的圆柱体外面。路径的花费是指这条路径所穿越的所有单元格中的数字
2012-05-03 16:27:03
2110
原创 [ACM] Where's Waldorf?
BackgroundGiven an m by n grid of letters and a list of words, find the location in the grid at which the word can be found.A word matches a straight, uninterrupted line of letters in the grid. A
2012-05-03 16:04:58
843
原创 [ACM]切木头
背景人们需要把一跟很长的木头切成几段,有一家名为 Analog Cutting Machinery (ACM) 的公司正在经营这一业务。他们根据切割前木头的长度来收费,木头越长、收费越高,并且每切割一次就收一次费。显而易见,在这里切割木头时,不同的切割顺序就会产生不同的价钱。譬如一跟 10 米长的木头,需要在 2、4、7 米处切开。如果顺序在这三个位置切割,需要的费用是 10 + 8 +
2012-05-03 10:08:53
1366
原创 动态规划学习之三种方法解决斐波拉契数
斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会采用递归,递归貌似简单,但是效率真的很高吗?不然!下面是我在学习动态规划的过程中总结的集中解决斐波拉契数的不同方法:一、最野蛮最原始的方法long f0(int n){ if (n =
2012-05-03 09:23:24
1830
IT公司计算机面试题精选大合集
2013-03-05
launcher源码(ADWlauncher+android4.0原生launcher)
2013-01-08
PDroid源码
2012-11-11
c#项目开发案例全程实录源代码
2012-04-21
ACM练习题库
2012-03-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人