C++常见面试题|Day 1

1、c 和 c++ 的区别

答:C是面向过程的语言,而C++是面向对象的语言,因此C++中有类和对象以及继承多态这样的OOP语言必备的内容,C++支持模板、运算符重载、异常处理机制,标准模板库STL;C只能写面向过程的语言,而C++既可以写面向过程的代码,也可以下实现面向对象的代码,C++还支持强大的设计模式,如单例,工厂等;在内存管理上C用malloc/free,C++用new/delete;输出方式不一样C用printf/scanf,C++用cout/cin,前者是C的库函数,后者是ostream和istream类型的对象。C++有三大特性,封装、多态、继承。C++的struct关键字不仅可以用来定义结构体,也可以用来定义类;在强制类型转换上也不一样,C的强制类型转换使用()小括号里面加类型进行类型强转的,而C++有四种自己的类型强转方式,分别是const_cast,static_cast, reinterpret_cast, dynamic_cast。

 

2、malloc和new的区别?

a) malloc只负责开辟内存,没有初始化功能,需要用户自己初始化;new可以进行初始化;

b) malloc是函数,开辟内存需要传入字节数,如malloc(100),表示在堆上开辟了100个字节的内存,返回void*,表示分配内存的起始地址,因此malloc的返回值需要强制转换成指定的类型的地址;new是运算符,开辟内存需要指定类型,返回指定类型的地址,因此不需要进行强转。

 

3、什么是多态?

用基类的指针或引用操纵多个类型的能力被称为多态。

多态就是不同对象对同一行为会有不同的状态。

实现多态的两个条件:一是虚函数重写,重写就是用来设置不同的状态;二是对象调用虚函数时必须是指针或引用。

实际上,代码上体现(动态)多态就是当父类指针指向子类对象,然后通过父类指针能调用子类的成员函数。

 

4、什么是虚函数?什么是重写?

虚函数是带有virtual关键字的成员函数;子类有个和父类完全相同(函数名,形参,返回值都相同,析构和协变函数除外)的虚函数,就称为子类虚函数重写父类虚函数。

 

5、什么是纯虚函数?作用?实现方式?

成员函数的形参后面写上=0,则成员函数为纯虚函数。

纯虚函数声明:

virtual 函数类型 函数名(参数列表) = 0

纯虚函数只有函数的名字而不具备函数的功能,不能被调用;

纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。

如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然为纯虚函数。

 

6、构造函数可以是虚函数吗?

不能。要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。虚函数必然对应一个虚函数表,虚函数表在构造函数初始化的时候进行初始化的,他也会初始化虚函数表,如果构造函数也是虚函数,那么就不会有虚函数表,就无法找虚函数表来调用这个虚函数。

 

7、析构函数可以是虚函数吗?

当作父类时就必须是。将被继承的父类的析构函数设置为虚函数后,可以保证在new申请一个子类对象,并使用基类指针指向该对象,当释放该基类指针时,可以保证子类的析构函数被执行,从而释放子类空间,避免内存泄露。

 

8、有哪几种强制类型转换,使用场景?

static_cast是静态转换,也就是编译时转换,可以完成基础类型的转换;同一继承体系中类型的转换;任意类型与空指针类型void*之间的转换。

dynamic_cast是运行时转换,用于存在虚函数的父子关系的强制类型转换。

const_cast是去除常量属性。

reinterpret_cast是用于任意类型之间的转换,对转换结果不做任何保证。

 

posted @ 2021-06-29 15:11  Season_Chu  阅读(50)  评论(0)    收藏  举报