(下午要去面试有道...还是做一点功课比较好...)
简答
1. 多态实现机制
多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制,通过父类指针调用子类的函数,可以让父类指针有多种形态。
编译器为每个类的对象提供一个虚表指针,这个指针指向对象所属类的虚表(存放了虚函数的地址)。在程序运行时,根据对象的类型去初始化vptr,从而让vptr正确的指向所属类的虚表,从而在调用虚函数时,就能够找到正确的函数。
在构造函数中进行虚表的创建和虚表指针的初始化。在构造子类对象时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否后还有继承者,它初始化父类对象的虚表指针,该虚表指针指向父类的虚表。当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。
2. 虚函数,纯虚函数
为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
3. 引用和指针的区别
(1) 引用必须被初始化,指针不必。
(2) 引用初始化以后不能被改变,指针可以改变所指的对象。
(3) 不存在指向空值的引用,但是存在指向空值的指针。
4. 重载和重写的区别
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。(和多态相关)
5. 拷贝构造函数(深拷贝和浅拷贝)
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数时拷贝构造函数。
浅拷贝是创建了一个对象用一个现成的对象初始化它的时候只是复制了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存); 深拷贝是当一个对象创建时,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但拷贝成员也拷贝分配给它的资源。
6. 内存分配方式及他们的区别
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
7. C++中类型转换机制
(http://blog.csdn.net/kesalin/article/details/8119586)
(1) 隐式类型转换
将某种类型的对象拷贝到另一种不同类型的对象中时就会发生隐式转型,不推荐。
(2) 显示类型转换
cast_name<type>(expression),cast_name可以是以下四种:
Ø static_cast
任何具有明确定义的类型转化,只要不包含底层的const,都可以使用static_cast。可以将非常量转化为常量,反之不可以。不进行安全检查。
Ø const_cast
可以将常量转换为非常量。只能改变常量属性,不能改变表达式的类型。
Ø dynamic_cast
主要用来在继承体系中的安全向下转型,它能安全地将指向基类的指针转型为指向子类的指针或引用,并获知转型动作成功是否。具有类型检查功能,比static_cast更安全,但是存在一定的效率损失。
Ø reinterpret_cast
只用于底层代码,一般我们都用不到它~依赖于机器,为运算对象的位模式提供较低层次上的重新解释。
8. new/delete和malloc/free的区别
new/delete是C++运算符,malloc/free是C语言的标准库函数。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数(除分配/释放内存外,还可能有其他更为详细的工作)。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
9. 进程和线程的区别
编程
1. 字符串里对称子串的最大长度
(腾讯实习生笔试题…当时居然空了……)
输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“goooogle”, 由于该字符串里最长的对称子字符串是“goooog”, 因此输出 6。代码如下:
#include<iostream>
#include<string>
usingnamespace std;
intsymLength(string str);
boolisSym(string str);
int main(){
string test;
int maxSymLength;
while(cin>>test){
maxSymLength =symLength(test);
cout << maxSymLength<< endl;
}
return 0;
}
intsymLength(string str)//字符串中最长的对称子字符串
{
int maxSymLength = 0;
if(str.size()==1) return 0;
for(int i=0; i<str.size()-1; i++)