现在的位置: 首页 > 综合 > 正文

趋势笔试题2012(1)

2018年05月05日 ⁄ 综合 ⁄ 共 9822字 ⁄ 字号 评论关闭

from:http://blog.sina.com.cn/s/blog_7ebe664201015vkv.html

1、

#include <iostream>

using namespace std;

class A{

public:

A() {func(0);};

virtual void func(int data) {printf("A1 :%d\n",data);}

virtual void func(int data) const {printf("A2 :%d\n",data);}

void func(char *str) {printf("A3 %s)\n",str);}

};

class B:public A{

public:

void func() {printf("B1 :%s\n","");}

void func(int data) {printf("B2 :%d\n",data);}

void func(char *str) {printf("B3 %s)\n",str);}

};

int main()

{

A *pA;

B b;

const A *pcA;

pA=&b;

pA->func(1);

pA->func("test");

A().func(1);

pcA=&b;

pcA->func(2);

return 0;

}

程序运行的结果:
A1 :0
B2 :1
A3 test)
A1 :0
A1 :1
A2 :2
1) 基类的指针指向派生类对象:那么该指针只能够调用基类所定义的函数,但是如果该函数为虚函数,则调用该派生类自己的成员
函数。(B2 :1)
2) 如果以派生类的指针指向基类对象,则必须事先做明显的转型操作,但是这种做法很危险。

**************************************************************************************************

2、

#include <iostream>

using namespace std;

template <typename T>    (1)

void func(const int &t)

{

cout<<t+100<<endl;

}

template <typename T>

void func(const T &t)

{

cout<<t<<endl;

}

int main()

{

func(10.3);

func(1000);

return 0;

}

程序运行结果:
10.3
1000
如果上述函数改为

#include <iostream>

using namespace std;

void func(const int &t)

{

cout<<t+100<<endl;

}

template <typename T>

void func(const T &t)

{

cout<<t<<endl;

}

int main()

{

func(10.3);

func(1000);

return 0;

}

则程序的运行结果为:
10.3
1100
如果使用函数的非模板形式,不能在前面加上template关键字。


 分析:
你在VC++环境下进行Debug调试,会发现:
1)如果语句(1)没有注释掉,程序运行时,函数 func(10.3)和func(1000)的调用,使用的模板函数为如下版本:
template<typename T>
void func(const T &t)
{
  cout<<t<<endl;
}
因此此时结果为10.3,1000。
2)如果把语句(1)注释掉,则:
func(10.3)运行,调用使用的模板函数为如下版本:
template<typename T>
void func(const T &t)
{
  cout<<t<<endl;
}
func(1000)运行,调用使用的是函数(不是调用模板函数):
void func(const int &t)
{
  cout<<t+100<<endl;
}
因此结果为:10.3,1100
原因解释:
1)没有注释掉代码(1)情况下,编译器均使用第二个模板函数来进行编译(func(1000)第一个模板函数不能实例化 因为不含模板参数T);
2)注释掉代码(1)情况下,func(整数)匹配,优先调用函数。
也就是说,在满足函数匹配的情况下,编译器优先使用函数匹配编译,函数不能匹配情况下,再使用模板匹配。

***************************************************************************************************

3、改错:

#include <iostream>

using namespace std;

class klass

{

public:

klass(){}

private:

~klass(){}

void func(int n){

cout<<"klass!!"<<endl; }

public:

void test()

{

func(100);

}

};

int main()

{

klass k;

k.test();

/ *klass *pk;

pk=new klass;

pk->test();* /

//程序通过,但是klass不能释放

return 0;

}

运行后程序显示:error C2248: 'klass::~klass' : cannot access private member declared in class 'klass'
证明析构函数的属性必须为public。
但是,如果把klass k改为klass* pk; pk=new klass; pk->test();程序通过,但是klass不能释放.
**************************************************************************************************
趋势的笔试题(zz)
1,你有5瓶药,每个药丸重10克,只有一瓶受到污染的药丸重量发生了变化,每个药丸重9克。给你一个天平,你怎样一次就能测出哪一瓶是受到污染的药呢?
2. 十个苹果,有一个不同.或轻或重.称三次.
3,有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必要带着手电筒。手电筒必须要传来传去,不能扔过去。每个女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。第一个女人:过桥需要1分钟;第二个女人:过桥需要2分钟;第三个女人:过桥需要5分钟;第四个女人:过桥需要10分钟。
***************************************************************************************************
答案 1.  调试好天平后,天平 左右盘各放两瓶,有下列情况:

       1.天平平衡,则余下那瓶的是受污染的药;
       2.天平左倾,则目标瓶在右盘,现在同时从左右盘拿下一瓶,观察到:若天平恢复平衡,则目标瓶就是右盘拿下的那瓶,若天平依旧左倾则目标就是右盘余下的那瓶;

       3.天平右倾,用上述2 类似的方法判断. 整个过程只用天平一次,只是注意拿下药瓶时从左右盘同时拿一瓶,然后稍作分析即可.

***************************************************************************************************
答案2. 1) 先取4个苹果,一边2个放天平.结果有A和B2种: 

          A) 重量相同,另取4个来称.结果有a和b2种: a) 如重量相同,留4个其中的1个,取剩余2个中的1个放天平另一边来称.如不同,那个就是了.如相同,最后的那一个就是了.
b) 如重量不同,参照B方案. 

          B) 重量不同,取任意一边的2个,一边1个来称.结果有c和d2种: c) 相同,则留其中一个,取剩余2个中的1个放天平另一边来称.如不同,那个就是了.如相同,最后的那一个就是了.
d) 不同,则留其中一个,从已称过的中取1个放天平另一边来称.如不同,那个就是了.如相同,另一个
就是了. (faint,这样就称了四次了)

**************************************************************************************************
答案3. A(1min) B(2min) C(5min) D(10min)

       ABCD---   0

       CD---AB   2

       ACD---B   3

       A---BCD   13

       AB---CD   15

       ---ABCD   17

**************************************************************************************************

 #include   <vector>  

 #include   <iostream>  

 using   namespace   std;    

 class   CDemo  

  

 public:  

          CDemo()   :   str(NULL)   {};  

         ~CDemo()   {   if   (str)   delete   []   str;}  

          char   *str;  

 };  

void   main   (void)  

  

          CDemo   d1;  

          d1.str   =   new   char[32];  

          strcpy   (d1.str,   "trend   micro");  

          cout   <<   d1.str;  

          vector<CDemo>   *a1   =   new   vector<CDemo>();  

          a1->push_back(d1);  

          delete   a1;  

    

 哪里有问题?

答案:a1->push_back(d1);
调用了CDemo的拷贝构造函数,而它是编译器自动生成的,所以有两个str指向同一块内存,析构函数调用两次,第二次delete   []   str;引起程序崩溃


class CDemo
{
public:

CDemo() : str(NULL) {};
~CDemo() { if (str) delete [] str;}
CDemo(const CDemo& x):str(0){
if(x.str){
str = new char[strlen(x.str)+1];
strcpy(str, x.str);
}
}

CDemo& operator=(const CDemo& x){
if(this == &x)
     return *this;
delete []str;
str = 0;
if(x.str){
     str = new char[strlen(x.str)+1];
     strcpy(str, x.str); 

return *this;
}
char *str; 

};
两次析构其实是对CDemo中的str引用的内存进行了两次析构,分别是
d1的析构和delete a1发生的析构。只要在CDome中,当CDome的对象发生拷贝构造或拷贝时,就将str指向不同的内存即可。所以会在拷贝构造函数和复制操作符中,从新申请一块内存并把源字符串拷贝到新的内存中就OK了 

***************************************************************************************************
1.5 Which of the following class DOES NOT need a copy constructor?

    a.A matrix class in which the actual matrix is allocated dynamically within the constructor and is deleted within its destructor.
    b.A payroll class in which each object is provided with a unique ID.
    c.A word class containing a string object and vector object of line and column location pairs. 

    d.A library class containing a list of book object.

答案:c

***************************************************************************************************

1.6 What is the color of the pixel at x,y?

int x = 100,y = 100;
putpixel(x,y,RED);
if(getpixel(x,y)==RED)
{
putpixel(x,y,GREEN);
}
if(getpixel(x,y)==BLUE)
{
putpixel(x,y,YELLOW);
}

if(getpixel(x,y)==GREEN)
{
putpixel(x,y,BLUE);
}
a.RED      b.GREEN c.YELLLOW d.BLUE

答案:d

****************************************************************************************************

1.7 What is the output of the following code?

void turn_left(int dir)
{
    dir
= (dir - 1);

}
void turn_right(int *p_dir)
{
*p_dir = (*p_dir + 1);
}
int main()
{

int dir1 = 3, dir2 = 3;
turn_left(dir1);
turn_right(&dir2);
printf(“%d %d”,dir1,dir2);
return 0;
}
a.3 3 b.3 4 c.2 3 d.none of the above 

答案:b

****************************************************************************************************

1.8 Which virtual function redeclarations of the Derived class are correct?

a. Base* Base::copy(Base*); Base* Derived::copy(Derived*);
b. Base* Base::copy(Base*); Derived* Derived::copy(Base*);
c. ostream& Base::print(int,ostream&=cout); ostream& Derived::print(int,ostream&); 

d. void Base::eval_r() const; void Derived::eval_r();

答案:c

overload和override的区别:

重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

***************************************************************************************************

今年趋势的一个笔试题 呵呵,当时看了真是觉得搞笑啊,这简直是恶搞题…… 

小明每周一到周五要去上学,周末休息。今天早上小明没有刷牙,这是为什么呢?请给出尽量多的原因。

***************************************************************************************************

   趋势科技笔试面试经历1 可以说,趋势科技是今年校园招聘开始的最早的公司之一了。10月15号,就收到了趋势的笔试通知。怀着激动的心情,参加了人生第一次笔试。试题是全英文的,分两部分,第一部分是45分钟的IQ和EQ题,这部分对我来说比较容易,平时看的多,做的很顺利。第二部分是技术题,120分钟,涵盖了c,c++,数据结构,数据库,网络(特别是tcp/ip)等知识,还有几道科技短文阅读。由于好久没碰过英语,很多关键的英语单词忘了意思,严重影响了我的发挥。考官说两周以内等面试通知。我也没放在心上。一个星期后,收到了趋势的面试电话,通知我去地铁大厦参加面试。当然很高兴啦。后来发现,同去笔试的几个兄弟都没收到面试通知,嘿嘿,看来我发挥的还不错嘛。当天下午,我就买了一件比较象样的衣服,毕竟是人生的处女面啊。晚上上网了解了下趋势科技,网络安全方面做的比较好的一个公司,新浪,hotmail用的都是趋势的产品。我们校园网的杀毒软件用的也是趋势的。
趋势的待遇很好,听说有8000左右一个月,流口水ing。上午10:30的面试,我提前半小时就到了,遇到了很多其他高校的帅哥,在和他们的聊谈过程中,我知道,他们竟都是硕士生,参加这次面试的有100位,最后只招二三十个。顿感压力巨大啊。 很准时,10:30,我被叫进去开始面试了.面试官是个四十出头的很和蔼先生,穿的也很随便,也许这就是趋势的企业文化?整个面试过程感觉还不错,技术问题基本都答上来了,一些开放性的问题答的也还可以,只是我有点紧张,感觉得出我地声音有点颤抖.下面我简单罗列下我碰到的问题:

1、简单介绍一下你做的项目
2、sturct和class的区别
3、虚函数和纯虚函数的区别,作用
4、有没有碰到过内存泄漏,怎么解决 5、老师对你的评价
6、你认为哪个老师比较牛,为什么?
7、同学们怎么评价你的,你同学认为你哪方面比较牛?
8、平时有什么兴趣和爱好
8、简单谈谈你对趋势的看法

走出地铁大厦,我还是很自信的.回到宿舍后突然我发现我那装简历的档案袋没拿,我顿时后悔起来,这是一个很严重的错误,从这个小小的疏忽,可以看出我的紧张,大意。这在工作中是万万要不得的.我想,就凭这一点,我是无望进入二面了.结果如我所料,没有收到下一轮的面试通知.这次失败的面试给了我惨痛的教训,以后无论做什么事,都要小心谨慎。 呵呵,凭我记忆写的首先是一堆智力题目,看图形选出不一样的,或者填出下一个然后是选择题,有一部分关于网络的,包括数据通信,什么路由器交换机之类的然后还有一些关于的,包括编程,呵呵考了一个原始套接字的,记住选就然后是一些大题。一道是数据结构的,链表的节点的反转,然后还有一道是写还是的原型来着。就记得这么多了,希望对师弟师妹有帮助。

***************************************************************************************************

2、sturct和class的区别:

STRUCT中的所有成员都是PUBLIC的,类中可以有PUBLIC,PRIVATE,PROTECTED。 STRUCT中不能包含成员函数但是CLASS中可以包括成员函数.class和struct的最基本的区别就是:在class中,在默认的情况下,它的成员是私有的,而在struct中,默认的情况下,它的成员是公有的!但是在一般编程的习惯中,在struct中一般只定义数据部分,而在class中一般都定义了数据部分和对这些数据操作的方法!

3、虚函数和纯虚函数的区别,作用

纯虚函数就是没有函数体的,必须在派生类中重载的函数。虚函数可以有函数体,如果派生类中没有重载函数,则调用父类的函数 class a { virtual b()=0;//纯虚函数 virtual c(){...}//虚函数 }; 虚函数主要实现多态机制避免二义性问题,至于纯虚函数是抽象类机制,基类提供接口,派生类提供实现,抽象类不能定义对象。最大区别:有纯虚函数的类不能定义对象。
基本来说纯虚函数是必须被重载的,因此在被用来做基类的抽象类中肯定有一个或多个纯虚函数。 而虚函数可以在继承类中被重载,也可以不。 二者都是体现了c++的多态性

纯虚函数:
(1).表明该纯虚函数所属的类仅做为接口使用,不能实例化(即不能生成一个该类的对象).
(2).接口类的子类(derived class)必须override每个纯虚函数,使之成为非纯虚函数后,该类才能产充许产生实例;
(3).纯虚函数可以有该函数的定义,有可以没有.但纯虚析构函数必须要有定义. 如果一个接口类只有它的析构函数的纯虚的,那么,该接口类的子类可以不必显式overriden接口类的析构函数,编译器自动产生的析构函数就可以overriden接口类的析构函数,使子类自动成为一个可实例化的普通类. 

4、有没有碰到过内存泄漏,怎么解决

就是使用内存资源后没有被回收。 在java中,用new在堆上分配的内存资源都会被java的garbage collector自动回收当一个类的实例不再被其它的任何变量引用的时候,它就有资格被回收,但是并不是一定会被回收,如果没有被回收,则就会产生内存泄露。 对,单元测试,一个一个得试,看是哪个模块出了问题。有点费时间,但这个最保险了代码的规范性很重要。

***************************************************************************************************

 

1.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?    
    全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。  
    全局变量分配在全局数据段并且在程序开始运行的时候被加载  局部变量则分配在堆栈里面。  
2.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?    
    交换机用在局域网中,交换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地址。路由器识别不同网络的方法是通过识别不同网络的网络ID(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地址。 
 但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。  
3.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?   TCPUDP呢?
    IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议,它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输 
【上篇】
【下篇】

抱歉!评论已关闭.