C++常见面试问题

来源:互联网 发布:赛维网络加班有工资吗 编辑:程序博客网 时间:2024/05/14 05:22
Q1:构造函数可以是虚函数吗?为什么?
A1:不可以。
从实现上,虚函数是使用虚表指针,而虚表指针存在于对象的内存空间中,而在构造函数调用之前,对象内存空间还没有分配,所以不存在使用虚表指针调用构造函数。
从使用角度上,虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用。
Q2:析构函数可以是纯虚函数吗?
A2:可以。
但是作为基类时需要给出定义,否则连接会出错;因为在调用派生类析构函数后,总会调用基类的析构函数。
class Fruit{
public:
    Fruit(){};
    virtual ~Fruit()=0;
};
Fruit::~Fruit(){}
Q3:析构函数可以重载吗?为什么?
A3:不可以,因为析构函数没有参数列表。
Q4:纯虚函数可以有函数体吗?
A4:可以,但是没有意义。
Q5:析构函数为什么一般情况下要声明为虚函数?
A5:可以使用基类指针指向派生类的对象,当删除该指针(delete p),如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。如果析构函数被声明为虚函数,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。所以,将析构函数声明为虚函数是十分必要的。
Q6:在基类中将析构函数定义成虚函数的作用是什么?
A6:当通过基类指针删除一个派生类的对象时,派生类的析构函数能够被调用。
Q7:如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?
A7:不可以,使用虚函数会产生系统开销,因为需要维护虚函数表;如果一个类不需要派生其他类,根本没有必要使用虚函数。
Q8:什么情况下必须定义拷贝构造函数?
A8:当类的对象用于函数值传递时(值参数,返回类对象),拷贝构造函数会被调用。如果对象复制并非简单的值拷贝,那就必须定义拷贝构造函数。
Q9:指针和引用的区别有哪些?
A9:
1.指针是一个变量,会分配内存空间;而引用是变量的别名,跟变量是同一个东西,所以不分配内存空间。
2.引用必须在定义是初始化,而且以后不能改变;而指针不是。
3.引用不能为NULL,而指针可以。
4.引用访问一个变量是直接访问,而指针是间接访问。
5.sizeof引用得到变量的大小,而sizeof指针是得到指针本身的大小。
Q10:能不能同时用static和const修饰类的成员函数?
A10:不可以。
C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐含的参数const this*。但是静态成员函数是没有this指针参数的。也就是说static的用法和const是冲突的。
Q11:静态成员函数能不能是同时也是虚函数?
A11 :不能。
调用静态成员函数不需要实例。但调用虚函数需要访问实例的虚表指针,通过虚表指针找到虚函数表以得到函数的地址,因此调用虚函数需要一个实例。两者相互矛盾。
Q12:重载(overload)和重写(override)的区别是什么?
A12:重载是在同一作用域中,函数名相同,但是参数类型、个数等不完全相同;
重写是在不同作用域中(基类和派生类),函数名和参数列表完全相同,并且该函数为虚函数
以下两种情况不是重写,而是隐藏
1.派生类函数与基类函数名称与参数列表完全相同,但是基类函数不是虚函数;
2. 派生类函数与基类函数名称相同但是参数列表不同,无论基类函数是不是虚函数。
Q13:类内可以重载new和delete运算符吗?如果可以的话,重载的函数可以是static的吗?
A13:当然可以;重载的函数无论是否加上static,都是static的。因为new对象时,对象还没有,所以要声明为static函数。delete对象也一样。
Q14:类中的静态属性会影响sizeof的值吗?
A14:不会的。sizeof(T)时,只考虑分配对象时需要的空间大小。
Q15:什么是虚拟继承?
A15:虚拟继承使得派生类如果继承基类多次,但只有一份基类的拷贝在派生类对象中。
0 0
原创粉丝点击