笔试题目收集(4)

1.求下列程序结果

 

#include"iostream" 
using namespace std; 
 
class A{ 
public:
   void funA();
};
class B{ 
public:
   void funB();
};
 
class C:public A,public B{
 
};
int main() 
{ 
    cout<<sizeof(C)<<endl;
    system("pause");
    return 0; 
}


输出结果:1。 在没有虚函数的时候,类的继承关系不分配虚表,也就没有指向虚表的指针,至于为什么是1。 本来求 sizeof 应该是 0 。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。可以参考 http://blog.csdn.net/u010064842/article/details/9222005 第七题。

 


2.求下列程序输出结果

 

#include"iostream"  
using namespace std;  

class A{  
public:
     A(int num=0){this->num = num;}
     virtual void fun1(){
	     cout<<"a="<<num<<endl;;
	     cout<<"A::fun1"<<endl;
     }
     virtual void fun2(){
	     cout<<"A::fun2"<<endl;
     }
private:
     int num;
};
class B{  
public:
     void funB(){};

};

class C:public A,public B{
};

int main()  
{  
     typedef void(*FUN)(); 
     A a(5);
     C c,c1;
     cout<<sizeof(A)<<endl;                                 //1
     cout<<"a虚表的位置"<<(int *)*(int *)&a<<endl;           //2
     cout<<"a中的num的值"<<*(int *)(((int *)&a)+1)<<endl;    //3
     cout<<endl;
     cout<<sizeof(C)<<endl;                                 //4
     cout<<"c虚表的位置"<<(int *)*(int *)&c<<endl;           //5
     cout<<"c1虚表的位置"<<(int *)*(int *)&c1<<endl;         //6
     FUN f = (FUN)*(int *)*(int *)&a;              
     f();                                                   //7
     system("pause");
     return 0;  
}  

运行结果:

 

下面对结果分析:

//1:输出8,因为类中有虚函数,所以每个对象包含一个虚指针(4字节),再加上int类型(4字节)。

//2:(int *)*(int *)&a,(int *)&a取出a对象的地址并转换为int*指针,*(int *)&a取出第一个元素的值也就是虚指针的                值,(int *)*(int *)&a,(int *)&a 转换为(int *)打印。具体结构如下:


//3:分析跟2是一样的,详细如上面的图解。

//4:一个虚指针+num的存储空间。

//5:对象c的虚指针,同时也看到对象a和对象c的虚指针不是一个地方,即父类和子类的虚指针不一样。

//6:对象c1的虚指针,发现c和c1的指针是一样的,同类子对象虚指针是一样的。

//7:  调用虚函数,但是参数没传入,打印的是随机值。

注:(int *)&a,指针转换为相应的类型


3.下列程序程序输出结果

 

#include"iostream"  
using namespace std;  

class A{  
public:
     virtual void fun1(){}
};
class B{  
public:
     virtual void fun2(){};

};

class C:public A,public B{
     char ch;
     int num;
};

class D:public A{
public:long long data;
};

int main()  
{  
     cout<<sizeof(A)<<endl;      //1
     cout<<sizeof(C)<<endl;      //2
     cout<<sizeof(D)<<endl;      //3
     D d;
     d.data = 25;
     cout<<*(long long *)((int *)&d+2)<<endl; //4
     system("pause");
     return 0;  
} 


 

输出结果:


//1:A中含有一个虚指针,所以大小为4

//2:C继承自B、C,因为B和C都有虚函数,所以此时C中有两个虚指针,分别指向两个虚表。同时C还有char和int类型两个成员,这里同样需要考虑对界问题。且这个这个对界,从0开始对的。具体如下:


//3:D中只包含一个虚指针,但是含有long long类型元素(8个字节),这是也要考虑对界问题,具体如下:


//4:((int *)&d+2)将地址加到下面红色的地方,然后转换成long long*指针类型,再取出指针所指内容。验证了下面结构的正确性。


4.选择题

 

 

#include <stdio.h>
int main(){
    int s;
    scanf(“%d”,&s);
    while(s >0)
    {
         Switch(s)
         {
             case 1:printf(“%d”,s+5);
             case 2:printf(“%d”,s+4);break;           
             case 3:printf(“%d”,s+3);
             default: printf(“%d”,s+2);break;
          }
         scanf(“%d”,&s);
    }
}


 

这段代码输入1 2 3 4 5 0回车,输出结果是(A)

A、6566567

B、65665672

C、66667

D、666672


 

5、linux的cron后台常驻程序(daemon)用于(D)

A、负责文件在网络找的共享

B、管理打印子系统

C、跟踪管理系统信息和错误

D、管理系统日常任务的调度


说明:在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对httpd 服务器重新启动,这就是一个计划任务;在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。

 


待续。。。。。。。


 

posted @ 2013-07-08 14:45  javawebsoa  Views(186)  Comments(0Edit  收藏  举报