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

231 金山笔试题

2018年01月19日 ⁄ 综合 ⁄ 共 2135字 ⁄ 字号 评论关闭

31.   金山笔试题:
1、C ++为什么经常将析构函数声明为虚函数?
          1、析构函数的作用与构造函数正好相反,是在对象的生命期结束时,释放系统为对象所分配的空间,即要撤消一个对象。
2、用对象指针来调用一个函数,有以下两种情况:
          如果是虚函数,会调用派生类中的版本。(在有派生类的情况下)
          如果是非虚函数,会调用指针所指类型的实现版本。
3、为什么要声明为虚函数?    
简单的说就是在实现多态时,如定义了一个指向派生类的基类指针,当delete该基类指针时,如果不将基类的析构函数声明为虚,只会调用基类的析构函数,而不会调用派生类的析构函数,为了保证同时调用派生类的析构函数,需要将析构函数声明为虚。                    
如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.

2、inline 和#define的如何定义MAX ,区别是什么。
         define成为“宏”,它在程序编译时只是在预处理的过程中实施简单的替换操作而已,但是在替换过程中可能出现各种不安全性问题,不进行参数有效性检查。1宏不能访问对象的私有成员。2、.宏的定义很容易产生二意性。
         内联函数和普通函数相比可以加快程序的运行速度,但它是以增加程序存储空间为代价的,由于不需要中断调用,在编译内联函数的时候内联函数可以直接被嵌入目标代码中。对于短小的代码,inline可以带来一定效率的提升,且与C时代的define(宏)相比,它更安全可靠。

宏和内联函数的主要区别如下:
    1. 宏是代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
    2. 宏不是函数,只是在编译前预处理阶段将程序中有关字符串替换成宏体。
    3. inline是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
总结如下:
    对于一般常量,最好用const和enum替换#define;
    对于类似函数的宏,最好改用inline函数替换#define。
    
3、const 的用法,如何解除 const 限制。
http://blog.csdn.net/cai0538/article/details/7046901
用const_cast解除 
比如定义
    const char  data[10]={"123"};
如果想要改变data的值为223就需要用如下方式
   const_cast<char*>(data)[0]='2';
   
4、智能指针的作用和设计原理。
        智能指针(smart pointer)是利用个引用计数的策略去处理指针的释放,从而保证指针的安全性。通常情况下,我们会自己去设计一个智能指针类去管理自己的指针对象。其 实其原理是存储指向动态分配的指针对象类,通过引用计数的功能去控制,去正确的实现指针对象的销毁,从而避免内存泄露。

       智能指针的原理是,通过将指针类和一个引用计数关联起来,而引用计数 计算,当前指针被多少个对象所共享。 每次创建一个新的指针对象的时候,初始化指针并将引用计数置为1;当对象作为另一个对象的副本而被创建的时候,拷贝构造函数拷贝指针并增加与之对应的引用 计数。对于一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并且增加右操作数所指对象的引用计数; 调用析构函数时,构造函数减少引用计数(如果引用计数减至0,删除基础对象)。
       在函数析构的时候,我们会发现引用计数在其中所起到的作用,从而避免误操作早成指针提前释放,造成指针悬挂,或者释放不彻底,造成内存泄漏的问题。

5、STL 中 vetor 如何自己设计,关键设计点,函数声明,自定义删除重复元素的函数。
6、如何用一条 SQL 语句,删除表中某字段重复的记录。

http://blog.csdn.net/jingxuewang110/article/details/6794180

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 
select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 
delete from people where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1)  and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1) 

抱歉!评论已关闭.