C++面试问题总结(一)

本文详细介绍了C++语言的特点,包括封装、继承、多态,并对比了C++与C语言的区别。深入探讨了C++中的多态性,静态多态与动态多态的实现。同时,解释了面向对象编程的基本概念,如封装、继承和多态。此外,还阐述了new操作符的工作原理、C++中struct与class的区别,以及C++结构体与C结构体的不同。最后,讨论了C++中导入C函数的关键字以及数组和指针的相关知识。
摘要由CSDN通过智能技术生成

1. C++语言的特点以及C++和C语言的区别?

特点:
C++三大特性:封装、继承、多态;
C++程序结构清晰、易于扩充、程序可读性好;
C++代码质量高,运行效率高、仅比汇编语言慢10%~20%;
C++更安全,增加const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try-catch等等;
C++可复用性高,引入了模板的概念,有专门的模板库(STL);
C++和C的区别:

1. C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等;
2. C++是面对对象的编程语言;C语言是面对过程的编程语言;
3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4. C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用。

2. C++中的多态是什么?

        在面向对象中,多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为(动态),与之相对应的编译时绑定函数称为静态绑定。所以多态分为静态多态和动态多态。

1. 静态多态。静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错。静态多态有函数重载、运算符重载、泛型编程等。

2. 动态多态。动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向 父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向 子类对象时,就调用子类中定义的虚函数。

(详细解答:1. 动态多态行为的表现效果为:同样的调用语句在实际运行时有多种不同的表现形态。 2. 实现动态多态的条件: - 要有继承关系 - 要有虚函数重写(被 virtual 声明的函数叫虚函数) - 要有父类指针(父类引用)指向子类对象 3. 动态多态的实现原理 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储类虚函数指针的数据结构, 虚函数表是由编译器自动生成与维护的。virtual 成员函数会被编译器放入虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr 指针)。在多态调用时, vptr 指针就会根据这个对象在对应类的虚函数表中查找被调用的函数,从而找到函数的入口地址。)

3. 什么是面向对象

         面向对象的思想是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,把客观世界中的实体抽象为问题域中的对象。面向对象以对象为核心,该思想认为程序由一系列对象组成。 面向对象思想的特点: 它是一种更符合人类思维习惯的思想 , 可以将复杂的问题简单化 ,将我们从执行者变成了指挥者 。

4. 面向对象的三大特征

面向对象的三大特征是:封装、继承、多态。

1. 封装, 将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。C++通过 private、protected、public 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。 

2. 继承, C++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。一个 B 类继承于 A 类,或称从类 A 派生类 B。这样的话,类 A 成为基类(父类), 类 B 成为派生类(子类)。派生类中的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。 继承的好处:提高代码的复用性;提高代码的拓展性;是多态的前提。

3. 多态,  多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向 父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向 子类对象时,就调用子类中定义的虚函数。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性。

5. new 的实现原理,new 和 malloc 的区别

new 的实现原理:

         如果是简单类型,则直接调用 operator new(),在 operator new() 函数中会调用 malloc() 函数,如果调用 malloc() 失败会调用 _callnewh(),如果 _callnewh() 返回 0 则抛出 bac_alloc 异常,返回非零则继续分配内存。 如果是复杂类型,先调用 operator new()函数,然后在分配的内存上调用构造函数。

new 和 malloc 的区别:

1,new 是操作符,而 malloc 是函数;

2,使用 new 操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而 malloc 则需要显式地指出所需内存的尺寸;

3,new 分配失败的时候会直接抛出异常,malloc 分配失败会返回 NULL;

4,对于非简单类型,new 在分配内存后,会调用构造函数,而 malloc 不会;

5,new 分配成功后会返回对应类型的指针,而 malloc 分配成功后会返回 void * 类型;

6,malloc 可以分配任意字节,new 只能分配实例所占内存的整数倍数大小;

7,new 可以被重载,而 malloc 不能被重载;

8,new 操作符从自由存储区上分配内存空间,而 malloc 从堆上动态分配内存;

9, 使用 malloc 分配的内存后,如果在使用过程中发现内存不足,可以使用 realloc 函数进行内存重新分配实现内存的扩充,new 没有这样直观的配套设施来扩充内存。

6. C++中 struct 和 class 的区别

1. struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装;
2. struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的;
3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承;
4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数。

7.  C++结构体和C结构体的区别

1. C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数;
2. C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种;
3. C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省      略 struct 关键字直接使用;
4. C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。


8. 导入C函数的关键字是什么,C++编译时和C有什么不同?

关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”, extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。

编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名

9. 数组和指针

概念:

(1)数组:数组是用于储存多个相同类型数据的集合。数组名是首元素的地址。

(2)指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。指针名指向了内存的首地址。

存储方式:
         数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。
        指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

10. 什么是野指针,怎么产生的,如何避免?

1. 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的);

2. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。

3.避免方法:

(1)初始化置NULL

(2)申请内存后判空

(3)指针释放后置NULL

(4)使用智能指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值