1、简述C++程序编译的过程?
程序的编译的过程就是将用户输入的文本形式的源代码转换成计算机可以自己识别和执行的机器代码的过程。这些二进制代码成为目标代码,将这些目标代码保存到磁盘中,成为目标程序。编译阶段主要是分析程序的语法结构,检查C++源程序是否存在语法错误,若发现错误会中断编译,并将错误反馈给用户。编译主要经过四个阶段:预处理、编译、汇编和链接
2、简述C++形参与实参的区别?
形参变量只有在被调用的时候才会分配内存空间,在调用结束时,即刻释放所分配的内存。因此形参只在函数内部有效,函数调用结束返回主调函数后,则不能再使用形参。形参的类型和数量在函数定义的时候确定
实参可以是常量、变量、表达式等,无论实参是何种类型的量,在进行函数调用时,它都必须具有确定的值,以便把这些值传递给形参。实参的类型和数量在函数调用的时候确定,且必须和形参的类型和数量相匹配
3、简述c++的内存分配,详细说一下栈、堆、静态存储区?
内存分配是指在程序运行期间,将内存空间分配给不同类型的数据和变量。C++的内存被分为五个部分,分别是:栈、堆、静态存储区、常量区和代码区,其中:
-
- 栈:系统自动分配的空间,只要不特殊说明,就默认定义在栈区。栈的内存分配速度很快,但大小有限。栈是先进后出,向下增长的。
- 堆:使用动态内存分配的方式,可以申请堆空间,在使用完成后要手动释放,堆的内存分配速度较慢,但大小不受限制。
- 静态存储区:全局变量和静态变量存放的区域,也是由编译器自动管理,无需手动干预。
4、简述const 有什么用途?
- 定义常量:使用const定义常量,一旦被定义,常量的值就无法被改变
- 保护数据:但我们不希望有些变量的值被修改时,就可以使用const修饰该变量
- 提高可读性:使用const可以是代码更加易读,因为它明确表示某个变量在程序中不会被修改
- 支持函数重载:在函数声明和定义中使用const,可以进行函数重载
5、简述C中的 malloc 和C++中的 new 有什么区别和联系?
- 区别:
- malloc和free是函数,new和delete是操作符
- 在C中使用malloc分配内存时,不会调用任何构造函数或析构函数;但new在分配内存时,会调用
- malloc和free不会管理对象的生命周期和内存越界检查,容易导致内存泄露,而new和delete会管理对象的生命周期,并进行相应的内存越界检查,提高了内存的安全性
- 联系:两者都是用于动态分配内存
6、简述什么是类的继承?
类的继承时面向对象编程中一个重要的概念,也是三大特性之一的多态实现的基础。继承是指通过创建新的类来扩展现有的类的功能,使得代码重用、扩展和维护更加容易。
- 简述关键字static的作用是什么?
- 定义静态变量:使得变量在函数执行过程中只初始化一次
- 定义静态成员函数,使得函数属于类而不是属于某个对象,可直接通过类名调用。管理类中的静态数据成员
- 定义静态数据成员:使得变量在所有对象中共享
- 定义静态类:使得类的所有成员都是静态,不能创建该类的实例对象
7、简述你对拷贝构造函数和赋值运算符的认识?
两者对于类的复制和复制至关重要,特别是在涉及动态内存分配和资源管理时,合理运用两者可以确保对象正确的复制和赋值。同时我们在使用的过程中,需要考虑深拷贝和浅拷贝的问题。
- 拷贝构造函数
- 每个类都必须有一个复制构造函数,以实现同类对象之间的值传递,如果没用定义,则系统会默认生成一个公有的拷贝构造函数
- 该类只有一个参数,并且是同类对象的引用
- 是一种特殊的构造函数,用于创建一个对象,该对象的内容与一个已存在的对象一致
- 赋值运算符重载
- 赋值运算符的重载是通过在类中定义一个成员函数实现的
- 重载赋值运算符允许程序员自定义对象之间的赋值行为
- 赋值运算符用于将一个对象的值赋给另一个对象