1、对于如下两个语句,描述正确的是:
1、int *p1 = new int[10];
2、int *p2 = new int[10]();
A、p1和p2申请的空间里面的值都是随机值
B、p1和p2申请的空间里的值都已经初始化
C、p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化
D、p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值
答案:C
理由如下:因为int是内置类型,而对于内置类型而言,它无法自定义构造函数,所以,new仅仅是内存分配,即第一句语句只是分配了内存,但是在new后面加了(),相当于调用了它的构造函数,这个时候就会初始化里面的值。而对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()。
2、下面的程序可以从0….n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m
knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i = 0; i < n; i++) {
if ( ) {
cout << i << endl;
( );
}
}
}
A、rand()%(n-i)<=m m--
B、rand()%(n-i)<m m--
C、rand()%(n-i)>=m m++
D、rand()%(n-i)>m m++
答案:B,理由如下:这道题最重要的两个条件是等概率和m个不同的数,前提条件是n远远大于m,m–,此时因为是输出i,i的值也是不同的,所以第二个条件成立。
(1)当i=0时,rand()%(n-i)的结果是0-(n-1)中的任意一个值,此时,如果结果输出0,则需要满足if里的条件,当条件为”rand()%(n-i) < m “时,输出0的概率是m/n;
(2)当i=1时,rand()%(n-i)的结果是0-(n-2)中的任意一个值,分为两种情况,第一种是当i=0时没有输出0,则此时m的值仍为m,则输出1的概率是m/(n-1);
第二种情况,是i=0时输出0,此时执行了m–,所以m=m-1,则输出1的概率是(m-1)/(n-1),综上,输出1的概率是(1-m/n)* m/ (n-1)+ m /n * (m-1)/(n-1)=m/n,以此类推,可以得到输出的概率都为m/n,所以B正确。
3、函数外部访问x等于什么?
enum string{
x1,
x2,
x3=10,
x4,
x5,
} x;
正确答案:0,理由如下:如果是函数外定义,那么是0
如果是函数内定义,那么是随机值,因为没有初始化
4、请问p1+5= 什么?p2+5= 什么?
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
答案:p1+5=801005,p2+5= 810014,理由如下:
p1指向字符型,一次移动一个字符型,1个字节;p1+5后移5个字节,16进制表示为5;
p2指向长整型,一次移动一个长整型,4个字节,p2+5后移20字节,16进制表示为14。
32位机器上, 任何指针变量都只占4个字节。 64位机器则是8个字节。
5、设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?
C c;
void main()
{
A*pa=new A();
B b;
static D d;
delete pa;
}
答案为:A,B,D,C;理由如下:这道题主要考察的知识点是 :全局变量,静态局部变量,局部变量空间的堆分配和栈分配;
其中全局变量和静态局部变量时从 静态存储区中划分的空间,
二者的区别在于作用域的不同,全局变量作用域大于静态局部变量(只用于声明它的函数中),
而之所以是先释放 D 在释放 C的原因是, 程序中首先调用的是 C的构造函数,然后调用的是 D 的构造函数,析构函数的调用与构造函数的调用顺序刚好相反。
局部变量A 是通过 new 从系统的堆空间中分配的,程序运行结束之后,系统是不会自动回收分配给它的空间的,需要程序员手动调用 delete 来释放。
局部变量 B 对象的空间来自于系统的栈空间,在该方法执行结束就会由系统自动通过调用析构方法将其空间释放。
之所以是 先 A 后 B 是因为,B 是在函数执行到 结尾 “}” 的时候才调用析构函数, 而语句 delete a ; 位于函数结尾 “}” 之前。
6、关于方法重载和方法重写的区别
方法重载(overload):方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
1.必须是同一个类
2方法名(也可以叫函数)一样
3参数类型不一样或参数数量不一样(当一个重载方法被调用时,Java用参数的类型或个数来决定实际调用的重载方法)
方法的重写(override):在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。
子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,( 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。)
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
7、主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300B和500B的有效载荷,第一个段的序列号为200,主机乙正确接收到这两个数据段后,发送给主机甲的确认序列号是
A、200
B、500
C、800
D、1000
正确答案:D,理由如下: 只需要记住确认序列号=原始序列号+TCP段的长度,所以第一次的确认序列号为500,第二次则为1000。