也没有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数
中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态
性,或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存
等工作,虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载,并且
在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时
有个统一的命名而已。
9. 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎
么知道的?
全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函
数或过程调用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全
局变量在 main 函数调用后,就开始分配,如果是静态变量则是在 main 函数前
就已经初始化了。而局部变量则是在用户栈中动态分配的(还是建议看编译原理
中的活动记录这一块)
10.
8086 系统是 16 位系统,其数据总线是 20 位。
8086 是多少尉的系统?在数据总线上是怎么实现的?
1. 编写用 C 语言实现的求 n 阶阶乘问题的递归算法:
long int fact(int n)
{
int x;
long int y;
if(n<0)
{
}
if(n==0)
printf("error!");
return 1;
x=n-1;
y=fact(x);
return (n*y);
}
2. 二分查找算法:
1) 递归方法实现:
int BSearch(elemtype a[],elemtype x,int low,int high)
/*在下届为 low,上界为 high 的数组 a 中折半查找数据元素 x*/
{
int mid;
if(low>high) return -1;
mid=(low+high)/2;
if(x==a[mid]) return mid;
if(x
else return(BSearch(a,x,mid+1,high));
}
2)
int BSearch(elemtype a[],keytype key,int n)
{
非递归方法实现:
int low,high,mid;
low=0;high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid].key==key) return mid;
else if(a[mid].key2
解:
int f(int n)
{
int i,s,s1,s2;
s1=1;/*s1 用于保存 f(n-1)的值*/
s2=1;/*s2 用于保存 f(n-2)的值*/
s=1;
for(i=3;i<=n;i++)
{
s=s1+s2;
s2=s1;
s1=s;
}
return(s);
}
4. 交换两个数,不用第三块儿内存:
int a = ……;
int b = ……;
a = a + b;
b = a - b;
a = a - b;
4
5. 冒泡排序:
void BubbleSort(elemtype x[],int n)
{
int i,j;
elemtype temp;
for(i=1;ix[j+1].key)
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
{
}
}
6. 语言 文件读写 c
#include "stdio.h"
main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w")==NULL)
{
printf("cann't open file\n");
exit(0);
}
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
}
7. 编程 winsocket
#include
#include
void main()
{
5
WORDwVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
{
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprint(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf);
printf("%s\n",recvBuf);
closesocket(sockConn);
WSACleanup();
}
}
注:这是 Server 端;File->New->Win32 Console Application,工程名:
TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在该工
程的 Setting 的 Link 的 Object/library modules 项要加入 ws2_32.lib
#include
#include
6
void main()
{
{
{
WORDwVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_porthtons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
注:这是 Client 端;File->New->Win32 Console Application,工程名:
TcpClient;然后,File->New->C++ Source File,文件名:TcpClient;同
理 , 在 该 工 程 的 Setting 的 Link 的 Object/library modules 项 要 加 入
ws2_32.lib
8.类的知识
C++
#include
class human
{
public:
human(){ human_num++;};
static int human_num;
7
~human()
{
human_num--;
print();
}
void print()
{
cout<<"human num is: "<