磊哥说java_磊哥_新浪博客

超级难题,怎么在构造函数中把一个类中的所有成员变量清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

a4c26d1e5885305701be709a3d33442f.png

(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值