一、题型:
问答五题,程序两题,选择10来题
二、题目
1) 堆和栈的区别与联系(C/C++的内容,不是数据结构的内容)?
1、栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。
栈与堆的区别:
1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存溢出。
2. 空间大小:堆内存几乎是没有什么限制。栈一般都是有一定的空间大小。
3. 碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。
4. 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
5. 分配效率:栈的效率比较高。堆的效率比栈要低得多。
2)重载和覆盖的区别与联系?
重载是指不同的函数使用相同的函数名,但函数的参数个数或类型不通。调用的使用根据函数的参数来区别不同的函数。
覆盖是指派生类中重新对基类的虚函数重新实现。即函数名和参数都一样,只是函数的实现体不一样。
3) 什么是多重继承,好处及缺点 ?
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。
优点:可以使用多重继承编写非常复杂、但很紧凑的代码,如C++ ATL库。
缺点:出现二义性、虚函数、访问权限等问题,容易产生混淆。
4)做过什么项目.遇到什么问题(不写似乎没事)
自己想吧,根据自己情况写。
5)不用第三个变量 交换两个int型的值(必须用C实现)
int a=2,b=3;
a=a+b;
b=a-b;
a=a-b;
6)链表删除操作
//此处实现删除链表中的第二个元素。
int *p,*q,*list; //p,q为指针类型
p=list; //p指向list的第一个元素
q=list; //q指向list的第一个元素
if (p->next != NULL) //list链表的元素不止一个
{
q=q->next; //q指向第二元素
p->next=q->next; //p->next指向第三个元素
delete q; //释放链表的第二个元素空间
}
7) 写一个程序,堆可以访问,栈不可以访问;
写一个程序,栈可以访问,堆不可以访问。
//堆可以访问,栈不可以访问,把构造函数设为private
class heap{
private:
heap(){
cout<<"堆可以访问,栈不可以访问"<<endl;
}
~heap(){}
};
//栈可以访问,对不能访问,把new设为private
struct DATA{
int a;
char b;
};
class stack{
public:
stack(){
cout<<"栈可以访问,堆不可以访问"<<endl;
}
~stack(){}
private:
DATA data = new DATA;
};
8)写一个程序,把两个字符串,串起来。
//连接两个字符串
#include<iostream.h>
#include <string.h>
#define N 100
void main()
{
char a[N];
char b[N];
char c[2*N];
int i;
cin>>a;
cin>>b;
int length1,length2;
length1 = strlen(a);
length2 = strlen(b);
for (i=0;i<length1;i++)
{
c[i]=a[i];
}
for (i=length1;i<length1+length2;i++)
{
c[i]=b[i-length1];
}
c[length1+length2]='\0';
cout<<c<<endl;
}
9)自己写一个程序,写str类的重载,add和delete还有“=”。
//自己写一个程序,写str类的重载,add和delete还有“=”
#include <iostream.h>
#include <string.h>
class str{
public:
str(){}
str(char* source){
ch=new char[strlen(source+1)]; //初始化字符串数组
strcpy(ch,source);
(*(ch+strlen(source)+1))='\0';
}
friend str operator +(str &c1,str &c2); //+号即add重载
friend str operator -(str &c1,str &c2); //-号即delete卸载
bool str operator ==(str &c1,str &c2); //==判等,重载两个字符串相等返回true,
//否则,返回false
char *ch;
};
str operator +(str &c1,str &c2){ //把c2接到c1后
return str(strcat(c1.ch,c2.ch));
}
str operator -(str &c1,str &c2){
return 0;
}
bool operator ==(str &c1,str &c2){
int i=0;
i=strcmp(c1.ch,c2.ch); //比较两个串
if(i==0)
return true; //相等则返回true
else
return false; //不相等则返回false
}
10)网络的三次握手过程
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
11)计算机操作系统同步的几种机制特点
a)sleep与wakeup同步机制。进程可由于多种原因使自己进入睡眠状态。
b)信号机制。作为统一用户的诸进程之间通信的简单工具。
c)管道机制。能够连接一个写进程和一个读进程,并允许他们从生产者-消费者方式进行通信的一个共享文件。
d)消息机制。允许一个进程发送消息给其他进程。
e)共享存储区机制。能使若干进程共享主存中的某个区域。
f)信号量集机制。信号量集有若干个信号量,对这组信号量操作是原子性的。
12) STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),各自的作用和之间的关系。
容器:是一个保存其他对象的对象,可以存放任何类型的对象,是对数据结构的一种抽象,以类模板的方式实现而成的。
算法:算法作用于容器。算法定义了对容器内容进行操作的方法,算法是对函数的一种抽象,采用函数模板实现。
迭代器是类似指针的对象,STL算法利用它们对存储在容器中的对象序列进行遍历。
迭代器提供了一种使容器与算法协同工作的机制。一个容器可以生成一对迭代器来制定一个元素系列,而算法则是对该系列进行操作。采用这种方式,容器和算法可以紧密地协作,同时还可以保持彼此“不知情”。
13)什么是多态?如何实现多态,有几种方法?
多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理。
实现方法:
a)通过一个指向基类的指针调用虚成员函数的时候,运行时系统将能够根据指针所指向的实际对象调用恰当的成员函数实现
b)基于绝对位置的定位技术
两个实现方法具体请看:
http://dev.yesky.com/189/2385189.shtml
三、选择题
选择题能想起来的就这些了,还有几题是多项题 。
1. 下列程序的输出结果
char a=256;
int b=a+1;
cout<<b<<endl;
输出结果为:1
2. 四个参数调用,传址,传值,引用?
3. 数组指针的几种表示,问哪一个不能表示那个地址?
4. 宏定义,f(x)=x*x,接下去就忘记了,就自己看下宏定义吧。