C++中的类,对象,虚函数都是面试过程中经常会考的问题。

在这里记录一下面试过程中类这一块经常遇到的题目

1.虚函数的作用

虚函数的作用主要是实现了多态的机制。 这样就可以把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。


2.虚函数和重载有什么区别

虚函数必须是在类里面实现。

函数重载调用根据参数个数、参数类型等进行区分,而虚函数则是根据动态联编来确定调用什么

函数重载可以在类里面,也可以在类外面。(重载和类没什么关系)

函数重载注意:

两个名字相同的函数要实现重载,至少要在参数个数或者参数类型上有所不同。例如:

Int f(int a,int b); float f(int a,int b) 就不能重载;


3.C++是如何实现接口的

纯虚函数


4.为什么C++默认的析构函数不是虚函数, 什么时候析构函数必须是虚函数?

C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数。

而是只有当需要当作父类时,设置为虚函数。这样可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。


6.构造函数可以是虚函数吗

不可以, 构造函数是知道全部信息才能创建对象,然而虚函数允许只知道部分信息。


6.深拷贝and浅拷贝

深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。

浅拷贝:夫妻共同账号。不同的名字,同一个账号

深拷贝:父子账号。 父亲给儿子开了账号,各用各的。


7.C++中拷贝赋值函数的形参能否进行值传递?

不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。。如此循环,无法完成拷贝,栈也会满。


8.区别拷贝和赋值操作

没重载 = 之前

A a ;

A b;

a = b; (这个是赋值操作)


A a;

A b = a; (这个是拷贝) 注意:这里B还没定义。

浅拷贝和赋值的区别,就是b是否已经定义

重载 = 之后

A a ;

A b;

a = b; (这个是赋值操作)


A a;

A b = a; 这里是深拷贝操作。 (=用的是自己重载的)

PS:C++中类默认的都是浅拷贝,所以很多时候要根据自己的需要重载 =。例如,下面这种情况就需要重载:

1
2
3
4
class A{
	int a;
	char b[5];  //出现这种数组,指针,要自己重载= 
}