Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410949
  • 博文数量: 93
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1052
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-19 11:01
文章分类

全部博文(93)

文章存档

2011年(1)

2009年(26)

2008年(66)

我的朋友

分类: LINUX

2009-01-07 22:55:50

1 c/c++

1.1 谈谈你对多态的理解。

多态是面向对象里面一个非常重要的概念。

多态,字面意思就是多种形态,也就是说同一个方法在基类和派生类中的行为是不同的。

在C++中,用虚拟函数来实现多态这个特性,关键字是virtual。如果没有使用关键字virtual,程序将根据指针类型或引用类型来选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。

从编译器的角度来说,多态是怎么实现的呢?

将代码中的函数调用解释为执行特定的函数代码块成为函数名联编。

对于非虚拟函数,编译器采用静态联编。静态联编效率高,但是不能解决虚拟函数的问题。

对于虚拟函数,编译器采用动态联编。具体方法是给每个对象增加一个隐藏成员,可以理解为是一个指针,该指针指向了虚拟函数表,虚拟函数表中存储了虚拟函数的地址。当派生类提供了虚拟函数的新的定义,则虚拟函数表将保存新函数的地址,如果派生类没有提供虚拟函数的新定义,则虚拟函数表将保存原始函数的地址。调用虚拟函数时,通过隐藏的指针来查找虚拟函数表,如果要调用的是类声明中的第一个虚拟函数,则将用虚拟函数表的第一个地址,如果要调用的是类声明中的第三个虚拟函数,则将用虚拟函数表的第三个地址。

2 对函数指针的理解

要理解函数指针,要明白三个方面的问题。第一,怎样定义一个函数指针;第二,怎样去用定义的那个函数指针;第三,知道了怎样定义,也知道了怎么用,那么在什么情况下会用到函数指针。

第一,怎样定义一个函数指针?

假如有下面的一个函数声明:

int atoi( const char *string );

int (*pAtoi)(const char *string);

那么pAtoi就是指向atoi函数的指针,注意不能写成下面的形式:

int *pAtoi(const char *string);

一定要加上小括号。

还可以用typedef来简化定义。

typedef int (*_pAtoi)(const char *string);

_pAtoi pAtoi = atoi;

则pAtoi也是指向atoi函数的指针。

第二,怎样使用函数指针?

使用函数指针来调用函数,就把(*pAtoi)看作函数名就可以了

第三,在什么情况下使用?

举例说明,假设要实现一个名为CalculateTime的函数,该函数可以估算执行制定行数的代码所需要的时间,并希望所有的程序员都来使用这个函数,对于所有程序员来说,CalculateTime这个函数一部分代码是相同的,但是允许程序员提供自己的算法来估算时间,这样就必须把每个程序员自己的估算时间的函数指针传给CalculateTime函数,这样就用到了函数指针。


2 数据结构

2.1 用链表怎样来模拟 栈 和 队列 ?

 模拟栈的操作,只要知道链表的头指针就可以了,入栈操作就是在头结点的前面插入节点,出栈操作就是删除头结点。


3 数据库

3.1 存储过程和存储函数的区别?

存储过程和函数本质上是没有区别的,不同的是函数的返回值在函数名本身,因此函数是可以嵌入在sql中使用的。这点才是最重要的区别。

3.2 写一个SQL语句,要求查出表中根据id排列的前20项,表名为user

select top 10 * from user order by id

3.3 说说你对存储过程的理解?

存储过程一些SQL语句经编译和优化后存储在数据库服务器中,使用时调用存储过程名即可。

存储过程的优点:

  • 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
  • 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
  • 存储过程可以重复使用,可减少数据库开发人员的工作量
  • 安全性高,可设定只有某此用户才具有对指定存储过程的使用权

4 网络编程

4.1  描述socket的编程的过程


5 嵌入式

5.1 POS机项目

阅读(1657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~