C++ 面试题(面向对象篇)

面向对象


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


1、什么是多态?

多态就是多种形态。相同的方法调用,不同的实现方式,即”一个接口,多种方法“。
就是用同样的接口访问功能不同的函数.在C++中主要分为静态多态和动态多态两种。其中,静态多态就是在程序运行前由编译器在编译期间完成的,主要通过函数重载和模板实现;动态多态就是在程序运行时根据实际类型调用相应的方法,主要通过虚函数实现.
注:引出函数重载和虚函数

2、什么是函数重载?有什么用?有什么好处?

在同一作用域内,可以有一组具有相同名字,不同参数列表(参数个数,参数类型,顺序)的函数,这组函数被称为函数重载.

常用来处理实现功能类似,数据类型不同的问题.
避免名字空间的污染,对于程序的可读性有很大的好处.

3、函数重载和重写的区别

定义不同:重载函数的参数类型,参数顺序和个数不同;重写的参数类型和返回值完全相同

范围不同:重载发生在一个类中;重写发生在继承类中.

4、为什么不能根据返回类型不同来重载

因为调用时不能指定类型信息,编译器不知道调用哪个函数。
函数返回值只是作为函数运行之后的一个”状态“,他是保持方法的调用者与被调用者进行通信的关键,并不能作为某个方法的”标识“。

5、运行期多态的实现原理

运行时多态通过虚函数和虚函数表实现.一个含有虚函数的类中至少都有一个虚函数表指针,且有一个虚表虚函数指针指向这个虚函数表.

6、虚函数的调用过程

通过对象内存中的虚函数指针vptr找到虚函数表vtbl,再通过vtbl中的函数指针找到对应虚函数的实现区域并进行调用。所以,虚函数的调用不由指针的类型决定,而由虚函数指针指向的位置决定。

7、继承下的构造函数和析构函数执行顺序

构造:先调用父类的构造函数、再调用成员变量的构造函数、最后调用类自身的构造函数
析构:先调用类自身类的构造函数、再调用成员变量的构造函数、最后父类的构造函数

8、构造函数和析构函数能否为虚函数?

构造函数不能为虚函数;析构函数可以为虚函数.

为什么构造函数不能为虚函数?
因为编译器会为每个含有虚函数的类创建一个虚函数表,在创建对象的时候会创建一个虚函数表指针指向虚函数表.如果构造函数为虚函数,则需要用对象来调用构造函数,构造函数之前对象还不存在,因此,构造函数不能为虚函数.

虚函数表为编译期创建,对象为运行时创建,虚函数指针也是运行时创建的,

为什么析构函数可以为虚函数?
当基类的对象的指针指向派生类对象,若析构函数不为虚函数,delete基类对象的时候,只会调用基类的析构函数,不会调用派生类的析构函数,这样会造成内存泄露.(若析构函数是虚函数,则会先调用派生类的析构函数然后再调用基类的析构函数)

9、虚函数表和虚函数表指针(vptr)的创建时机?

编译期确定.
虚函数表是用来存放一个类中虚函数地址的表.
编译期编译器就为每个类确定好了对应的虚函数表里的内容.所以,再程序运行时,编译器会把虚函数表的首地址赋值给虚函数表指针,所以,这个虚函数表指针就有值了.
运行时创建.
因为虚函数表指针跟着对象走,对象什么时候创建,vptr就什么时候创建.

10、虚析构函数的作用

基类采用虚析构函数会防止内存泄露。
当基类的对象的指针指向派生类对象,若析构函数不为虚函数,delete基类对象的时候,只会调用基类的析构函数,不会调用派生类的析构函数,这样会造成内存泄露.

11、空类默认产生哪些类成员函数

主要有四种:默认构造函数、拷贝构造函数、默认赋值函数、析构函数和两个取值运算符(一个带const,一个不带)

12、一个空类会占多大的空间

1字节。

13、一个类中有一个或多个虚函数会占用多大的类空间

当有虚拟成员函数时,一个或多个都是仅增加4字节。

14、什么时候必须重写拷贝构造函数

包含动态成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载=赋值操作符
一般三种情况我们可能需要拷贝构造函数:
一个对象作为函数参数,以值传递的方式传入函数体;
一个对象作为函数返回值,以值传递的方式从函数返回;
一个对象用于给另一个对象进行初始化。

15、深拷贝和浅拷贝

在对象拷贝拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节赋值(位拷贝。也叫浅拷贝),对于类类型成员变量,调用其相应类型的拷贝构造函数。

深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符;
浅拷贝:也叫位拷贝,拷贝构造函数,赋值重载多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄露。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值