C++面试常问题

本文详细比较了C和C++在语法、内存管理、数据类型和特性上的差异,涵盖了静态多态、动态多态、指针与引用、重载与重写等概念,以及new、delete等内存操作,还讨论了static和const的作用,以及STL中的vector、deque和list容器。
摘要由CSDN通过智能技术生成

目录

1.C和C++的区别

2.C++的三大特性

3.静态多态和动态多态

4.指针和引用的区别

5.C++重载、重定义、重写

6.new、delete、malloc、free之间的关系

7.static的作用

8.const的作用

9.STL


1.C和C++的区别

1)C是面向过程的语言,是一个结构化的语言,考虑如何通过一个过程对输入进行处理得到输出;C++是面向对象的语言,他有“封装、继承和多态”三大特征。

2)C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete关键字。

3)C++中有引用,C中不存在引用的概念。

4)C语言有的标准库函数,它们松散的,只是把功能相同的函数放在头文件中;C++对于大多数的函数都是有集成的很密集,是一个集体。

2.C++的三大特性

1)封装:封装隐藏了实现细节,将数据和方法结合成形成类,使得代码模块化,提高了代码的复用性和安全性。

2)继承:派生类可以继承父类的数据和方法,扩展了已经存在的模块,减少重复代码,增加复用性;让类与类之间产生关系,是多态的前提。

3)多态:一个接口,多种实现,通过子类重写父类的虚函数,实现了接口的重用,提高了程序的扩展性。

3.静态多态和动态多态

1)静态多态:又称编译期多态,即在系统编译期间就可以确定程序将要执行哪个函数。例如:函数重载,通过类成员运算符指定的运算。

2)动态多态:动态多态是利用虚函数实现运行时的多态,即在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数。

4.指针和引用的区别

1)指针是一个新的变量,存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;引用只是一个别名,还是变量本身,对引用的任何操作就是对变量本身进行操作,以达到修改变量的目的。

2) 引用被创建的同时必须被初始化,指针则可以在任何时候被初始化。

3)不能有NULL 引用,引用必须与合法的
存储单元关联,指针则可以是NULL。

4)一旦引用被初始化,就不能改变引用的关系,指针则可以随时改变所指的对象。

5.C++重载、重定义、重写

1)重载:函数名相同,参数的个数、参数类型、参数顺序不同。

2)重定义:子类重新定义父类中有相同名称的函数(参数列表可以不同但不能是虚函数),重定义后父类的方法就会被隐藏。可以通过作用域去调用父类隐藏的方法。

3)重写:子类重新定义父类中有相同名称和参数的虚函数。

6.new、delete、malloc、free之间的关系

1)malloc对开辟的空间大小严格指定,而new只需要对象名.。

2)new/delete是运算符,编译器保证调用构造和析构函数对对象进行初始化/析构。但是库函数malloc/free是库函数,不会执行构造/析构。

3)分配动态内存失败时,new会抛出异常,malloc则会返回一个空指针。

7.static的作用

1)修饰全局变量:该变量只可以在同一个文件中使用。

2)修饰局部变量:将该变量存在静态区,不会因为函数的结束或者一个生命周期的结束而释放。

3)修饰函数:该函数只能在同一个文件中被调用。

4)修饰类的数据成员:表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有,它先对象一步存在,要在类外进行初始化。

5)修饰类的成员函数:由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员。

6)静态成员函数只能访问静态成员,非静态成员函数可以访问静态成员和非静态成员。

8.const的作用

1)const修饰类的成员变量,表示常量不可能被修改。

2)const修饰类的成员函数,表示该函数不会修改类中的数据成员,不会调用其他非const的成员函数。

3)const函数只能调用const函数,非const函数可以调用const函数。

9.STL

1)vector:

a.它是顺序容器,是一个动态数组,在内存中是一块连续的空间。

b.它可以随机存取元素,可以通过索引值直接存取,或者用at()方法。

c.它尾部添加或移除元素非常快速,但在中部或头部插入元素或移除元素时,由于移动的数目多,所以效率比较低。

d.它的元素地址是连续的,动态扩容后可能地址会发生变化,即可能会在一块新的地址重新放新的连续的元素。

2)deque:

a.deque是双端数组,而vector为单端(vector两端都可以操作,但操作其时长度为朝着一端增长,因此其为单端,双端的意思为在最前面增加不用移动元素位置,也可以朝前增长)。

b.deque在接口上和vector十分相似,在许多操作的地方可以直接替换。

c.deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)。

d.deque头部和尾部添加或移除元素都非常快速,但在中部插入或移除元素比较费时。

e.deque容器的地址不像vector一样是连续的,它动态扩容后地址不一定是连续的,之所以用下标访.问还是不会出错因为它源码重载了[]符号。

3)list:

a.list是一个双向链表容器,可以高效地进行插入删除元素。

b.list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。

c.如果需要频繁插入和删除数据,遍历的不会特别多的时候用。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值