C++面试常见问题

泛型编程
c++支持的另一种编程模式,它与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单。不过OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型。
OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务的工具。
泛型编程需要对语言进行扩展,以便可以只编写一个泛型函数,并且将其用于各种实际类型。
泛型编程是编译时绑定,而虚函数是运行时绑定。
泛型编程的基础是模板。
OOP
面向对象程序设计的本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反应现实世界中事物特征的。任何一个模型都不可能反应客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所设计的范围内更普遍、更集中、更深刻的描述客体的特征,通过建立模型而达到抽象是人们对客体认识的深化。
三个目标:重用性、灵活性和可扩展性。
类是对现实世界的抽象,包括静态属性的数据和对数据的操作,对象是类的实例化。
封装:
将一个计算机系统中的数据以及和这个数据有关的一切操作语言组合到一起,一并封装在一个有机实体中。
封装的基本单位是对象,使得软件结构的相关部件实现高内聚低耦合。
对用户而言,对象是如何进行操作、运行、实现都是透明的。简化了操作的步骤,提高了用户的易用性。
继承:
继承是指两个或者两个以上的类之间的联系和区别。是后者延续前者的某些方面的特点。
继承又可以分为:可分为单继承和多继承
多态:
多态是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;从微观上讲,多态性是指一组对象的一个类中,面向对象技术可以使用相同的调用方法来对相同的函数名进行调用,即便这若干个函数的实现方法不同。
多态的实现方式是虚函数。
多态性将接口和实现进行分离;用共同的方法,但因个体差异,而采用不同的策略。
静态绑定和动态绑定
绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。
在编译时进行绑定的叫静态绑定。
在运行时进行绑定的叫动态绑定。
动态绑定和类的继承以及多态相联系的,子类是父类的一个特例,所以父类能出现的地方,子类也可以出现,因此在运行过程中,当一个对象发送消息请求服务时,要根据对象的具体情况将请求的操作与实现的方法进行连接。
静态绑定程序运行速度更快,动态绑定程序更加灵活。
模板
三种模板:类模板、函数模板、成员模板
模板的泛化,模板参数都是未知的,在根据模板创建实际对象时,需要提供所有参数。
模板的特化,针对某一种特殊类型,进行特殊处理。
模板的偏特化,模板中有多个模板参数,但绑定部分的模板参数
虚函数
在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。
虚函数的作用:
实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖的成员函数。
虚函数的限制:
非类的成员函数不能定义为虚函数
类的静态成员函数和构造函数不能定义为虚函数
注意:析构函数可以定义为虚函数,因为将基类的析构函数定义为虚函数后,当delete删除一个派生类定义的对象指针时,系统会相应的调用类的析构函数。否则,系统只会调用基类的析构函数。
虚函数表
虚函数表是一块连续的内存,每个内存端元中记录了一个JMP(跳转指令)的地址。
编译器会给每一个有虚函数的类创建一个虚函数表,该表被该类的所有对象共享。
只要类中有虚函数,在生成对象时,会为该对象多分配一个指针,该指针指向虚函数表。
名称空间
名称空间是c++支持的一项特性,旨在让您编写大型程序以及多个厂商现有的代码组合起来的程序时,更容易,它有助于组织程序。
一个潜在的问题,可能使用两个封装好的产品时,它们都含有一个名字相同的函数,在使用该函数时,编译器不知道应该使用哪个版本。这是则可以用名称空间+作用符(::)+函数名进行访问。
共用体
共用体是一种数据结构,它能够存储不同的数据类型,但是只能同时存储一种类型。
关键字:union
共用体的长度为最大成员的长度。
指针和引用
指针是一个变量,其存储的是值的地址,而不是指本身。
引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名。
区别:
引用不可为空,创建时,必须初始化。指针可以为空,可在任何时候被初始化。
有const指针,没有const引用
sizeof指针是指指针本身的大小,sizeof引用则是返回所引用的对象的大小。
指针可以是多级,引用只能是一级。
如果返回动态内存分配的对象或内存,必须使用指针,引用可能引起内存泄漏。(当一个对象已经不需要再使用,本该回收时,另一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收,而滞留再堆内存中,这就产生了内存泄漏)
指针和引用的自增运算含义不一样。
动态数组
在预编译过程阶段,数组长度是不能预先知道的,必须在程序运行时动态给出,则需要用new动态定义数组。
new关键字做得三件事
获得一块存储空间
调用构造函数
返回正确的指针

自动存储、静态存储、动态存储
在函数内部定义的常规变量使用自动存储空间,当函数调用时,自动产生,函数结束时消亡。
静态存储时整个程序执行期间都存在存储方式。
成为静态的方式有两种:
在函数外定义
声明变量时使用关键字static
动态存储是由new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池(自由存储空间或堆)。它可以在一个函数中声明,然后在另一个函数中释放,因此函数的声明周期不完全受程序或函数的生存周期控制。
内联函数
常规函数调用使程序跳到另一个地址,并在函数结束时返回。而内联函数是编译器将使用相应的函数代码代替函数调用。付出的代价就是占用更多的内存。
默认参数
默认参数指的是省略了实参时自动使用的一个值。
对于带参数列表的函数,必须从右向左添加默认值。所以要为某个参数设置默认值,则必须为它右边所有参数提供默认值。
函数重载
函数多态(函数重载)是c++新增的功能,函数重载的关键是函数的参数列表。如果两个函数的参数和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而变量名是无关紧要的。c++允许定义名称相同的函数,条件是它们的特征标不同。
运算符重载
可以重定义或重载大部分c++内置的运算符。
重载的运算符时带有特殊名称的函数。
不可重载的运算符:
. 成员访问运算符
.,-> 成员指针运算符
:: 域运算符
sizeof 长度运算符
?: 条件运算符
# 预处理运算符
转换函数
转换函数(转换函数是一种运算符函数)是用户自定义的强制类型转换,可以相使用强制类型转换那样使用。
注意: 转换函数必须是类方法
转换函数不能指定返回类型
转换函数不能有参数。
继承
公有继承:is-a的关系,派生类对象也是一个基类对象,可以对基类对象执行任何操作。
保护继承:protect与private相似,在类外只能用公有类成员来访问protected部分中的类成员。private和protected之间的区别只有在基类派生的类中才能体现出来。派生类的成员可以访问基类的保护成员,但不能访问基类的私有成员。因此,对于外部世界来讲,保护成员的行为与私有成员类似,但对于派生类来讲,保护成员与公有成员相似。
私有继承:
has-a的关系,基类的公有成员和保护成员都将变成派生类的私有成员。这意味着基类方法将不能成为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们。
初始化基类组件:使用类名而不是成员名来标识构造函数
访问基类方法:只能在派生类的方法中使用使用基类方法,并且只能通过作用域解析符来调用父类的公有方法。
访问基类对象:强制类型转换
多继承:
MI描述的是有多个直接基类的类,。与单继承相同,公有MI表示is-a关系。注:默认继承方式是私有方式。
两个主要的问题:
从不同基类继承的同名方法。
从两个或多个相关基类那里继承同一个类的多个实例。
虚基类:使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
包含和私有继承
包含和私有继承都是建立has-a关系的手段。
包含的优点在于易于理解,可以避免继承引起的很多问题。
私有继承的优点:
若类包含保护成员,则这样的成员在派生类中是可用的。
需要重新定义虚函数时,私有继承就变得十分关键。
所以当需要建立has-a关系时,如果需要访问原有类的保护成员或需要定义虚函数时,才使用私有继承,其他情况使用包含。
抽象基类
含有纯虚函数的基类就是抽象基类。
抽象基类不能实例化。
抽象基类的存在就是为了提供接口。
友元
友元类:
友元类的所有方法都可以访问原始类的私有成员和保护成员。
当is-a关系和has-a关系都不满足两个类之间的关系时,可以考虑友元关系。比如电视机和遥控器的关系。
友元为类开发提供更灵活的接口。类可以将其他函数、其他类和其他类的成员函数作为友元。
智能指针
智能指针的行为类似于常规指针,区别在于他负责自动释放所指向的对象。
智能指针分为三种:
shared_ptr:允许多个指针指向同一个对象,每一个shared_ptr都有一个关联的计数器,当出现或者销毁一个shared_ptr时,会增加或者减少计数器。当计数器为0时,它就会自动释放自己所管理的对象。
unique_ptr:独占所指向的对象
weak_ptr:指向share_ptr所管理的对象,weak_ptr是一种不控制所指向对象生命期的智能指针,它指向一个有shared_ptr管理的对象,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的计数器,一旦指向对象的shared_ptr被销毁,对象就会被释放,无论有没有weak_ptr指向对象,都会释放。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值