笔试题

来源:互联网 发布:现金贷系统源码 编辑:程序博客网 时间:2024/06/02 15:46
转自:http://blog.xdnice.com/blog-109346-64693.html
1) 下列关于异常处理的描述中,理解不正确的是:
A) C++语言的异常处理机制通过3个关键字throw、try和catch实现
B) 任何需要检测的语句必须在try语句块中执行,并由throw语句抛出异常
C) throw语句抛出异常后,catch利用数据类型匹配进行异常捕获
D) 一旦catch捕获异常,不能将异常用throw语句再次抛出
答案:D

52) 若A是类名,则下列定义中,定义指向对象数组的指针p的是
A) A *p[3]   B) A (*p)[3]  C) (A*)p[3];   D) A(*p[3]);
答案:B

53) 基于以下程序段:
Class A
{
    public:
        A()
          {
              printf("A ");
          }
        ~A()
        {
            printf("~A ");
        }
};

Class B
{
     public:
          B(A &a) : _a(a)
          {
               printf("B ");
          }
          ~B()
          {
              printf("~B");
          }
    private:
         A _a;
};

int main()
{
    A a;
    B b(a);
    return 0;
}
以上程序段输出是:
A) A B ~B ~A    B) A A B ~B ~A ~A   C) A B ~B ~A  ~A   D) 以上都不对
答案:C
 _a(a)赋值不会调用构造函数

54)若以上程序中,把
B(A &a) : _a(a)
{
    printf("B");
}
改为
B(A &a)
{
    printf("~B");
    _a = a;
}
输出结果是:
A) A B ~B ~A    B) A A B ~B ~A ~A     C) A B ~B ~A ~A    D) 以上都不对
答案: B

55) 下列叙述正确的是:
A) 预处理命令行必须位于源文件的开头
B) 在原文件的一行上可以有多条预处理命令
C) 宏名必须用大写字母表示
D) 宏替换不占用程序运行时间
答案:D
宏替换在程序预编译时完成,不占用运行时间

56) 以下不能作为合法常量的是:
A) 1.234e04    B) 1.234e0.4     C) 1.234e+4     D) 1.234e0
答案:B
57) 如下程序段,则程序输出:
char a[]="abc",b[]={'x', 'y', 'z'};
 
 if (strlen(a) > strlen(b))
  printf("a > b ");
 else
  printf("a <=b ");
则程序输出:
A) a>b   B) a<=b  C)编译不通过 D) 以上都不对
答案:B
这题比较难,如果问a,b谁占的内存空间大,应该是a,a以字符串结束标志''结尾,b没有'',而strlen以'/0'来判断字符串结尾,strlen(b)会找到''后结束,至于哪里有''是未知的,但一定在'x','y','z'之后,因此strlen(a)<=strlen(b)

58) 如下C++程序
int i = 0x22222222;
char szTest[] = "aaaa";    //a的ascii码值为0x61
func(i,szTest);                  //函数原型为void func(int a, char* sz);
请问刚进入func函数时,参数在栈中的形式可能为____(左侧为地址,右侧为数据)
A) 0x0013FCF0 0x61616161    B) 0x0013FCF0 0x22222222
   0x0013FCF4 0x22222222       0x0013FCF4 0x0013FCF8
   0x0013FCF8 0x00000000       0x0013FCF8 0x61616161

 
C) 0x0013FCF0 0x22222222    D) 0x0013FCF0 0x0013FCF8
   0x0013FCF4 0x61616161       0x0013FCF4 0x22222222
   0x0013FCF8 0x00000000         0x0013FCF8 0x61616161
答案可能为:B

这道题很难,我想了很久,查了很多网页,也问过自己身边的好友,得不出令人信服的答案,只能写一下自己写的一段分析代码,算是抛砖引玉吧。
代码如下:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
void __cdecl func(int p1, char *p2)
//void __stdcall func(int p1, char *p2)
{
 //p1-1的地址、值
 cout << &p1-1 << "|" << *(&p1 -1) << endl;
 //p1的地址、值
 cout << &p1 << "|" << *(&p1) << endl;
 //p1+1的地址、值
 cout << &p1+1 << "|" << hex << *(&p1 +1) << endl;
 //p1+1所保存的值所指向的值
 cout << (char*)*(&p1 +1) << endl;
 //p1+2的地址、值
 cout << &p1+2 << "|" << *(&p1+2) << endl;
 
}
int main()
{
 
 int i = 0x22222222;
 char szTest[] = "aaaa";  //a的ascii码值为0x61
 //oct hex
 //i的地址和值
 cout << &i << "|" << hex << i << endl;
 //sz的地址和值
 cout << &szTest << "|" << szTest << endl;
 //函数地址
 cout << &func << endl;
 cout << "Call Function..." << endl;
 //调用开始
 func(i,szTest);     
 return 0;
}
运行结果如下:
0012FF7C|22222222
0012FF74|aaaa
004010A5
Call Function...
0012FF1C|401b3a
0012FF20|22222222
0012FF24|12ff74
aaaa
0012FF28|0
如果func采用__stdcall结果如下:
0012FF7C|22222222
0012FF74|aaaa
004010A0
Call Function
0012FF1C|401b4a
0012FF20|22222222
0012FF24|12ff74
aaaa
0012FF28|0
我只能根据以上结果分析得出可能是B


59)如下程序

struct IU
{
 virtual void QI(void **p) = 0;
};

struct IA : public IU
{
 void func()=0;
};

struct IB : public IU
{
 virtual void func();
};

class C:public IA,public IB

{

pulbic:

void IA::func()
{
     printf("IA func ");
}

void IB::func()
{
    printf("IB func ");
}

void QI(void **p)

{

    *p = (IA*)this;

}
};

void main()

{

    C c;

    IB *pB = &c;

    IA *pa;

    pB->QI((void**)&pA);

    pA->func();

    pB->func();

}

该程序的运行结果是

A) IA func             B) IA func

    IA func                  IB func

C) IB func             D)  IB func

    IA func                  IB func

这道题比较诡异,似乎要考查多继承,但代码不能通过编译。貌似答案B

60 )如下程序

class A
 {
 public:
  virtual void Test()
  {
   printf("A test ");
  }
 };
 class B : public A
 {
 public:
  void func()
  {
   Test();
  }
  virtual void Test()
  {
   printf("B test ");
  }
 };
 class C : public B
 {
 public:
  virtual void Test()
  {
   printf("C test ");
  }
 };

void main()

{
 C c;
 ((B*)(&c))->func();
 ((B)c).func();

}

该程序的执行结果

A) C test             B) B test

    B test                  B test

C) B test                  A test

     C test                 C test

答案:A

基类指针可以指向派生类的对象,但函数调用仍然是派生类;若强制类型转化则调用基类函数

原创粉丝点击