超级难题,怎么在构造函数中把一个类中的所有成员变量清0?要通用解决方案
我用了很久的一个语句是这样的
memset(this,0,sizeof(*this));
局限性如下:
1:类中不能有虚函数,
2:类中不能用带虚函数表的类成员变量,
谁还有更好的解决方案呢?要注意是要通用解决方案,与具体类无关的啊。
最好能这样,
foreach object in thisclass
{
if(object.isDataMember)
object=object.type();
}
(2010-10-15 10:37)
标签:
杂谈
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
1. 位域的定义和位域变量的说明
位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表
};
其中位域列表的形式为:
类型说明符 位域名:位域长度 例如:
struct bs
{
&
(2010-10-15 10:22)
标签:
杂谈
联合体也叫共用体。联合体与结构体有一些相似之处,但两者有本质的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。
2.特点
在使用联合体类型数据时要注意
1).一个联合体变量每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合体变量的某一个成员值。
2).联合变量中起作用的成员是最后一次存放的成员。
3).不允许只用联合变量名做赋值或其他操作,如a=1;或b=a,均为错。
4).不允许对联合变量做初始化赋值,赋值只能在程序中进行。
5).不能把联合变量作为函数参数,也不能使函数带回联合变量,但可以使用指向联合变量的指针。
6).联合体类型可以出现在结构体类型定义中,也可以定义联合体数组,结构体也可以出现在联合体类型定义中,数组也可以作为联合体的成语。
程序:
#include< stdio.h>
void main()
{
union t
{
int age;
char *name;
int i
标签:
杂谈
#include
#define maxvertexnum 100
#define queuesize 100
#define null 0
typedef struct{
int front,rear,count,data[queuesize];
}cirqueue;//循环队列结构定义
typedef int vertextype;//为了简单,设图中结点的数据为整型
typedef struct node{
int adjvex;//存放邻接点序号
struct node *next;//指向下一个边结点
}edgenode;//图的邻接表的边结点定义
typedef struct vnode{
vertextype vertex;//顶点数据域
edgenode *firstedge;//指向第一个边结点
}vertexnode;//图的邻接表表示的顶点结点定义
typedef vertexnode adjlist[maxvertexnum];//用向量定义图的邻接表表示的顶点表
typedef struct{
adjlist adjlist;
int n;//图的顶点数
int e;//图的边数
}algraph;//定义图的邻接表
typedef enum{FALSE,TRUE}boolean;
boolean visited[maxvertexnum];//保存访问信息的布尔向量
main()//主函数
{//建立图g,并进行深度优先搜索和广度优先搜索
(2010-09-12 14:02)
标签:
杂谈
群硕的笔试在语言方面主要是Java和C++,夹了一道C#题,趁记忆犹新的时候记下来
一、给了一棵二叉树的前序遍历和中序遍历,要求写出后序遍历。
看一下数据结构就行了,很easy。提示:前序遍历的第一个节点为根结点,在中序遍历中根结点的左边节点是左子树,右边节点是右子树,如此递归。
二、什么是物理内存和虚拟内存,OS中为什么要使用虚拟内存?
看OS的书。
三、解释一下C#中的“delegate”。
原先不清楚的,然后在技术面试的时候问了一下面试官,原来类似于一个队列,队列中存的是函数指针(托管函数),运行时队列中的函数会在一个线程中被依次执行。
四、与子程序传递参数有哪些方法?
汇编题,我想起来三个:参数压栈、参数存寄存器、参数存数据段。
五、解释一下Java中的String和StringBuffer,什么时候需要使用StringBuffer?
核心是String对象是不变对象,连接、取子串等操作会生成新的对象,旧对象可能会被回收。StringBuufer则是可变对象,上述操作将在原对象上进行。
六、Java中哪些容器的默认布局器(
(2010-09-12 13:54)
标签:
杂谈
1、线索二叉树的结点结构
二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,有两种方法。一是在结点结构中增加向前和向后的指针fwd和bkd,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。现将二叉树的结点结构重新定义如下:
lchild
ltag
data
rtag
rchild
其中: ltag=0 时 lchild指向左子女;
(2010-09-10 00:37)
Profile是针对每个帐户的数据存储,比如一个电子商务网站的用户购物车数据。
“用户配置文件”是Profile这个词的直接翻译,其实没有文件的意思,默认存储在数据库中,不用自己管理文件。
Profile是HttpContext类的一个属性,是ProfileBase类,继承自SettingsBase类。
所谓Provider,是你可以定义Profile如何存储,默认是存储在LocalServer数据库中,需要网站重启动不丢失数据,所以不能存在内存中。
web.config中必须的Profile属性:什么叫必须?你如果不修改默认存储,只有每个Profile的name是必须的,如:
defaultProvider='SqlProvider'>//修改存储才需要
name='SqlProvider'
type='System.Web.Profile.SqlProfileProvider'
connectionStr
(2010-09-07 16:02)
标签:
杂谈
一、适配器模式简介(Brief Introduction)
适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作。
二、解决的问题(What To Solve)
使用第三方组件,而这个组件的接口与目前系统接口不兼容(如方法与系统方法不一致等),可以使用适配器模式解决接口不兼容问题。
使用早前项目一些有用的类,可以用适配器模式解决现有接口与原有对象接口不兼容问题。
三、适配器模式分析(Analysis)
1、适配器模式结构
2、源代码
1、客户期待的接口或者抽象类Target
public abstract class Target
{
public abstract void R
(2010-09-05 19:54)
一.O/R Mapping 概论
工厂模式+反射+每个数据库的DAL层来解决数据访问层的代码
针对数据库表中字段的变化我们是无法预料的,所以每一次用户需求的修改都会直接导致我们程序员来修改—实体类(BE层),数据访问层(DAL),这样同样会导致以上的各层BLL,UI等等的修改,长久的下去,只会造成项目的噩梦。
在软件高速发展的今天,已经有很多的人在为这个问题而努力了,其中最有成果的就是java社区,因为java社区的开源精神,促使了一个新的概念的诞生。
O/R Mapping的思想。
二.什么是O/R Mapping?
O:object
R:relationship
Mapping:映射
将关系型数据库与我们的面向对象联系起来,
将表与类(实体类,javabean)联系起来
我们的程序直接与对象打交道,而不去关心是什么类型的数据库以及是不是数据库了。
三.为什么要O/R Mapping?
考虑我们原先的JDBC或者ADO.NET,我们的代码是这个样子的:
Using System.Data.SqlClient;
SqlConnection conn = ne
(2010-08-28 19:48)
标签:
杂谈
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能.
首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址.
那我们先看看一个例子:
#include
class a {};
class b{};
class c:public a{
virtual void fun()=0;
};
class d:public b,public c{};
int main()
{
cout<
cout<
cout<
cout<
return 0;}
程序执行的输出结果为:
sizeof(a) =1
sizeof(b)=1
sizeof(c)=4
sizeof(d