2012年6月7日
摘要: 在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针。例如,如下声明 :void putValues( int[ 10 ] ); 被编译器视为 void putValues( int* ); 数组的长度与参数声明无关,因此,下列三个声明是等价的: // 三个等价的 putValues()声明 void putValues( int* ); void putValues( int[] ); void putValues( int[ 10 ] ); 因为数组被传递为指针 所以这对程序员有两个含义:1. 在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上, 阅读全文
posted @ 2012-06-07 10:12 莫水千流 阅读(371) 评论(0) 推荐(0) 编辑
  2012年5月31日
摘要: 公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。1. 公有继承(public)公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2. 私有继承(private)私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。3. 保护继承(protected)保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。下面列出三种不同的继 阅读全文
posted @ 2012-05-31 17:00 莫水千流 阅读(621) 评论(0) 推荐(0) 编辑
  2012年5月30日
摘要: GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较。GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统:进程 Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程。如何使用 GDB 调试 proc2 或者 proc3 呢?实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代 阅读全文
posted @ 2012-05-30 09:37 莫水千流 阅读(422) 评论(0) 推荐(0) 编辑
  2012年5月29日
摘要: 在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的。什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个c 阅读全文
posted @ 2012-05-29 14:10 莫水千流 阅读(365) 评论(0) 推荐(0) 编辑
  2012年5月23日
摘要: 让我们开门见山的讨论本话题:可以继承的函数可以分为两种:虚拟的和非虚拟的。然而,重定义一个非虚拟的派生函数始终是一个错误(参见第36条),因此,我们可以放心地将此处的讨论范围缩小至以下情况:继承一个含有默认参数值的虚函数。此情况下,本条目的证明问题则显得十分了然:虚函数是动态绑定的,而默认参数值是静态绑定的。你说啥?静态绑定于动态绑定之间的区别已经让你头晕目眩了?(静态绑定又称早期绑定,动态绑定又称晚期绑定,这是官方说法。)我们只好复习一下了。一个对象的静态类型就是你在对其进行声明时赋予它的类型。请考虑下面的类层次结构:Code highlighting produced by Actipro 阅读全文
posted @ 2012-05-23 09:18 莫水千流 阅读(1355) 评论(0) 推荐(2) 编辑
  2012年5月21日
摘要: 1、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);2、如果类里面有成员类,成员类的构造函数优先被调用;3、基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的 顺序而不是它们在成员初始化表中的顺序;4、成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中 被声明的顺序而不是它们出现在成员初始化表中的顺序;5、派生类构造函数 作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递 给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于 正确地修改或扩展基类的实现。(... 阅读全文
posted @ 2012-05-21 10:47 莫水千流 阅读(556) 评论(1) 推荐(0) 编辑
  2012年5月8日
摘要: 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了 阅读全文
posted @ 2012-05-08 14:32 莫水千流 阅读(298) 评论(0) 推荐(0) 编辑
  2012年4月6日
摘要: 今天看STL源码遇到一个问题:template <class _T1, class _T2>inline void _Construct(_T1* __p, const _T2& __value) { new ((void*) __p) _T1(__value);}上网搜到了一些文章,分享了:原帖地址: http://www.ksarea.com/articles/20080124_cc.htmlplacement new释疑"placement new"? 它到底是什么东东呀?我也是最近几天才听说,看来对于C++我还差很远呀!placement new 阅读全文
posted @ 2012-04-06 10:57 莫水千流 阅读(552) 评论(1) 推荐(1) 编辑
摘要: C++ new用法之一 new运算符最常用的是作为运算符的new,比如:string *str = new string(“test new”);作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。new会在堆上分配一块内存,并会自动调用类的构造函数。C++ new用法之二 new函数第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:void *operator new(size_t size);new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加 阅读全文
posted @ 2012-04-06 10:11 莫水千流 阅读(6463) 评论(0) 推荐(1) 编辑
  2012年4月2日
摘要: #define UNIQE_NAME "{1AB792D6-EAF2-3267-9A84-9135681127A4}"#define GIS_MSG "{D48CA993-4925-41cb-8F59-ABAAAFCEF797}"const UINT ID_GIS_INSTANCE = ::RegisterWindowMessage(GIS_MSG);//注册消息// 确保程序只有一个实例在运行m_hOneInstance = ::CreateMutex(NULL, FALSE, UNIQE_NAME);if (GetLastError() == ERR 阅读全文
posted @ 2012-04-02 17:03 莫水千流 阅读(197) 评论(0) 推荐(0) 编辑