考研复试--C++

1.C++内存分区

在C++中内存分为5个区,这5个区分别为:堆,栈(动态存储区),静态存储区,自由存储区以及常量存储区
1.堆:在堆中主要存放由new分配的内存块。通常情况下,一个new操作之后就要对应着一个delete操作来释放内存块,但如果如果程序没有释放掉,那么在程序结束后,操作系统会自动回收。
2.栈:在栈中主要存放局部变量以及函数的参数等,一般在子函数开始运行时就会为这些变量以及参数分配空间,而在子函数结束运行后就会释放空间。
3.静态存储区:在静态存储区中主要存放的是全局变量以及静态变量,一般在程序开始运行时就会为这些变量分配空间,而程序运行结束后才释放空间
4.自由存储区:自由存储区与堆类似,主要存放由malloc等分配的内存块
5.常量存储区:常量存储区中主要存放的是常量,一般不允许修改常量的值

堆与栈的区别:
1.申请方式不同
栈是由系统自动分配的,而堆则是由程序自己申请的
2.存储内容不同
栈中主要存储的是局部变量以及函数的参数等临时数据,而堆中主要存储的是应用程序动态申请的内存块

2.定义和声明的区别?

变量声明:只是告诉应用程序变量的类型和名字

变量定义:不仅仅告诉应用程序变量的类型和名字,还为变量分配内存空间以及赋予变量初值

extern关键字:用extern关键字是声明变量而不是定义变量。

3.内存泄漏,内存溢出与栈溢出

内存溢出:内存溢出是指程序在申请内存空间时,内存没有足够的内存空间供其使用,这样情况就称为内存溢出

内存泄漏:系统丧失了对程序中动态分配内存块的控制权,从而无法释放这些内存块,导致了内存的浪费

栈溢出:栈中存放的是局部变量,函数参数等临时数据,那么当这些临时数据所占据的内存空间大于栈的拥有的内存空间时,就会出现栈溢出的现象。

4.局部变量与全局变量的区别

1.存储方式
局部变量存放在栈中,一般在子函数开始运行时就会为局部变量分配内存空间,而在子函数结束运行后就会释放局部变量所占有的内存空间。
全局变量存放在静态存储区中,一般在程序开始运行时就会为全局变量分配内存空间,而程序运行结束后才释放全局变量占有的内存空间
2.作用域
局部变量的作用域主要是在子函数的作用范围内,而全局变量的作用域则是整个程序。

5.i++与++i的区别

i++是先使用i的值,然后执行对i加1,而++i则是先对i执行加1,随后再使用i的值

6.什么时候会调用构造函数与拷贝构造函数?

当生成一个普通的类对象的时候会自动调用普通构造函数,当用一个类对象去初始化另一个对象时会调用拷贝构造函数,拷贝构造函数是一个特殊的构造函数,该函数的参数为一个类对象

7.深构造与浅构造

假设现在有两个同类对象A与B,B对象是A对象的拷贝,如果拷贝的方式为浅拷贝,那么对象A与对象B引用的是同一个地址空间,如果拷贝的方式为深拷贝,那么对象A与对象B引用的是不同的地址空间。

8.const与define的作用

const的作用:
1.const可用来修饰变量,使该变量变为只读变量,不能进行修改
2.const可用来修饰成员函数,使得该函数只能访问数据成员而不能修改数据成员
3.const可用来修改对象,使得该对象只能调用const修饰的成员函数,非const对象可以访问任意成员函数,包括const成员函数。

define的作用:
#define又称宏定义,#define 的功能是将标识符定义为其后的常量。例如在程序中写下#define Maxsize 100,那么在程序的预编译阶段就会将所有的Maxsize标识符替换为常量100

9.const与define的区别

(1)就起作用的阶段而言: #define是在预编译阶段起作用,而const是在 编译、运行的时候起作用。

(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。

(3) 就存储方式而言:#define进行的是字符串替换,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份,而const定义的只读变量在程序运行过程中只有一份备份。

10.指针,指针变量与引用的区别

在内存中,一个内存地址对应着一个存储单元,而存储单元是存放数据或内存地址的空间。
指针变量:指针变量是存放内存地址的变量,也就是说该变量所对应的存储单元中存放的是内存地址。

指针:指针的本质就是内存地址

引用:引用的本质其实就是指针常量,也就是说该常量所对应的存储单元中存放的是内存地址,而且该存储单元中的内容不能进行修改,并且引用在使用的时候必须要先进行初始化且引用不能为空。

11.Static关键字的作用

1.修饰数据成员 :由static关键字修饰的数据成员会存放在静态存储区中,可以被多个对象共享,即每个类对象都可以访问及修改该数据成员
2.修饰成员函数:函数原先就存放在静态存储区中,所以用static关键字修饰的成员函数在内存上没有多大的变化,但用static关键字修饰的函数可以通过类名直接调用
3.修饰局部变量:局部变量原先存放在栈中,而用static关键字修饰的局部变量则会存放在静态存储区中,只有当程序运行结束时,该局部变量所占据的内存空间才会被撤销

12.构造函数与析构函数的作用

析构函数:析构函数的作用就是在对象撤销之前,进行必要的清理工作
构造函数:构造函数的作用就是进行数据成员的初始化

13.友元函数及友元类

友元函数:在类中用friend关键字声明类外的函数,那么这个函数就称为该类的友元函数,而友元函数可以访问这个类的所有私有数据成员。
友元类:在A类中用friend关键字声明B类,那么这个B类就称为A类的友元类,此时B类中的所有函数都可以访问A类的私有数据成员。

14.运算符重载

运算符重载的方法是定义一个重载运算符的函数,所以,运算符重载实质上是函数的重载。那么对于运算符重载的函数有两种处理方式:第一种是把运算符重载函数作为类的成员函数,第二种是运算符重载函数不是类的成员函数,而在类中把它声明为友元函数。
而这两者的主要区别是:第一种处理方式可以通过this指针自由地访问本类的数据成员,因此可以少写一个函数的参数,但是要求运算表达式的第一个参数是一个类对象,而且要与运算符重载函数的类型相同。

15.重载,重写,重定义的区别

重载:有两个或两个以上函数名相同,但参数个数,参数类型或函数返回值不同的函数,这种情况就称为函数重载

重写:在父类中定义了一个虚函数,而在子类中又重新定义了这个函数,那么这样的情况就称为重写

重定义:在父类中定义了一个非虚函数,而在子类中又重新定义了这个函数,那么这样的情况就称为重定义

16.继承与组合的区别

继承与组合都是软件重用的重要方式,但两者的区别在于,继承强调的是"is a"(“是”)关系,而组合强调的是"has a"(“有”)关系。例如,现在有3个类,动物类,狗类以及牙齿类,那么狗类继承于动物类,而狗类组合了牙齿类,也就是说狗是动物,而且狗有牙齿。

17.多态性

多态性通俗理解就是:对于具有相同函数名的函数,其功能不同
多态性分为静态多态性动态多态性

静态多态性是指程序在编译时就已确定要调用哪个函数,静态多态性是通过函数重载实现的

动态多态性是指程序在运行过程中才能动态确定要调用哪个函数,动态多态性是通过虚函数实现的

18.虚函数,纯虚函数与虚基类

虚函数是用virtual关键字修饰父类中与子类相同的函数,其作用是确保当父类指针指向子类对象并调用同名函数时,运行的是子类中的函数

纯虚函数类似于JAVA中的接口,在父类中只负责声明纯虚函数,而具体的实现则留给子类完成,此外声明了纯虚函数的类无法进行实例化

虚基类是用于多继承中,使得在继承间接共同基类时只保留共同基类的一份成员,例如A类中有数据成员data,B类和C类是A类的子类,而D类则同时继承了B类和C类,那么当D类对象访问数据成员data时,编译器就会报错,因为编译器无法确定要访问的是哪个类中的数据成员data,那么虚基类就用来解决这类问题

19.为什么析构函数要用虚函数?

最主要的原因是防止内存泄漏,例如用new关键字创建一个子类对象,并且用父类指针指向子类对象,如果父类的析构函数是虚函数,那么使用delete关键字释放指针时,首先会调用子类的析构函数,随后再调用父类的析构函数;如果父类的析构函数不是虚函数,只会调用父类的析构函数,那么子类对象所占据的内存空间就不会被释放,从而导致内存泄漏

20.C++与JAVA的区别

1.JAVA是运行在JVM上的,之所以说JAVA的可移植性强是因为JVM可以安装到任何系统中

2.垃圾回收机制的区别,C++是使用析构函数回收内存空间的,而JAVA则是自动回收的,所以在编写C/C++程序时需要注意内存空间的回收

3.在JAVA中没有指针的概念,引入了真正的数组

21.C++模板是什么?

C++中模板的形式有两类:函数模板以及类模板
函数模板仅针对参数类型不同的函数,类模板针对于数据成员以及成员函数类型不同的类,使用模板的目的就是让程序员编写与类型无关的代码

22.面向对象和面向过程的区别?

面向过程:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一
步实现,使用的时候一个一个依次调用

面向对象:面向对象是把构成问题事务分解成各个对象,描述某一个事物做某件事情的
行为,以功能来划分问题

23.C++程序执行过程

C++程序执行过程分为4步:1.预处理 2.编译 3.汇编 4.链接
首先C++源程序经过预处理会得到扩展名为".i"的文件,预处理中主要的任务是执行源程序以#开头的语句,随后对扩展名为".i"的文件进行编译,编译之后就会形成汇编文件,随后使用汇编器处理汇编文件就会得到二进制文件,最后将二进制文件与所依赖的库函数进行链接并且装入到内存

24.函数参数传递中值传递、地址传递、引用传递有什么区别?

值传递:形参仅仅是复制实参的值,所以不会引起实参的值的改变
地址传递:形参是指针变量,那么该变量中存放的是实参的内存地址,有可能会引起实参的值的改变
引用传递:形参是实参的引用,所以也有可能会引起实参的值的改变

25.this指针

this指针的本质就是一个对象指针,存放的是当前对象的内存首地址,因此可以通过this指针来访问类中的数据成员

26.什么是比较好的编程风格

1.变量名,函数名,类名尽量采用有意义的名称
2.写代码是最好要有一些必要的注释
3.将程序的功能模块化
4.尽量减少嵌套

27.什么是预处理

预处理是在程序源代码被编译之前,由预处理器对程序源代码进行的处理。例如,在预处理阶段,会对#define关键字进行处理,将标志符定义为某些常量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xulidanga

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值