(0) 指针和引用的区别
指针是一个新的变量,指向另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;而
引用是一个别名,对引用的操作就是对变量的本身进行操作
指针可以有多级,引用只有一级
传参的时候,使用指针的话需要解引用才能对参数进行修改,而使用引用可以直接对参数进行修改
指针的大小一般是4个字节,引用的大小取决于被引用对象的大小
指针可以为空,引用不可以。
(1)在函数参数传递的时候,什么时候使用指针,什么时候使用引用?
需要返回函数内局部变量的内存的时候用指针。使用指针传参需要开辟内存,用完要记得释放指
针,不然会内存泄漏。而返回局部变量的引用是没有意义的
对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要
更小
类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式
(2) 堆和栈有什么区别
从定义上:堆是由new和malloc开辟的一块内存,由程序员手动管理,栈是编译器自动管理的内
存,存放函数的参数和局部变量。
堆空间因为会有频繁的分配释放操作,会产生内存碎片
堆的生长空间向上,地址越来越大,栈的生长空间向下,地址越来越小
(3)堆快一点还是栈快一点?(字节提前批一面)
栈快一点。因为操作系统会在底层对栈提供支持,会分配专门的寄存器存放栈的地址,栈的入栈出栈操
作也十分简单,并且有专门的指令执行,所以栈的效率比较高也比较快。而堆的操作是由C/C++函数库
提供的,在分配堆内存的时候需要一定的算法寻找合适大小的内存。并且获取堆的内容需要两次访问,
第一次访问指针,第二次根据指针保存的地址访问内存,因此堆比较慢。
(4) new和delete是如何实现的,new 与 malloc的异同处
在new一个对象的时候,首先会调用malloc为对象分配内存空间,然后调用对象的构造函数。delete会
调用对象的析构函数,然后调用free回收内存。
new与malloc都会分配空间,但是new还会调用对象的构造函数进行初始化,malloc需要给定空间大
小,而new只需要对象名
(5)既然有了malloc/free,C++中为什么还需要new/delete呢?
https://blog.csdn.net/leikun153/article/details/80612130
malloc/free和new/delete都是用来申请内存和回收内存的。
在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行
析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能
强加给malloc/free。
(6) C和C++的区别包括但不限于:
C是面向过程的语言,C++是面向对象的语言,C++有“封装,继承和多态”的特性。封装隐藏了实现
细节,使得代码模块化。继承通过子类继承父类的方法和属性,实现了代码重用。多态则是“一个
接口,多个实现”,通过子类重写父类的虚函数,实现了接口重用。
C和C++内存管理的方法不一样,C使用malloc/free,C++除此之外还用new/delete
C++中还有函数重载和引用等概念,C中没有
(7)delete和delete[]的区别
delete只会调用一次析构函数,而delete[]会调用每个成员的析构函数
用new分配的内存用delete释放,用new[]分配的内存用delete[]释放
(8) C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的
垃圾回收机制)
包括但不限于:
C++ 和Java都是面向对象的语言,C++是编译成可执行文件直接运行的,JAVA是编译之后在JAVA虚
拟机上运行的,因此JAVA有良好的跨平台特性,但是执行效率没有C++ 高。
C++的内存管理由程序员手动管理,JAVA的内存管理是由Java虚拟机完成的,它的垃圾回收使用的
是标记-回收算法
C++有指针,Java没有指针,只有引用
JAVA和C++都有构造函数,但是C++有析构函数但是Java没有
(9)C++和python的区别
包括但不限于:
- python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。
python可以很方便的跨平台,但是效率没有C++高。 - python使用缩进来区分不同的代码块,C++使用花括号来区分
- C++中需要事先定义变量的类型,而python不需要,python的基本数据类型只有数字,布尔值,
字符串,列表,元组等等 - python的库函数比C++的多,调用起来很方便
(10) Struct和class的区别
使用struct时,它的成员的访问权限默认是public的,而class的成员默认是private的
struct的继承默认是public继承,而class的继承默认是private继承
class可以用作模板,而struct不能
(11) define 和const的联系与区别(编译阶段、安全性、内存占用等)
联系:它们都是定义常量的一种方法。
区别:
define定义的常量没有类型,只是进行了简单的替换,可能会有多个拷贝,占用的内存空间大,
const定义的常量是有类型的,存放在静态存储区,只有一个拷贝,占用的内存空间小。
define定义的常量是在预处理阶段进行替换,而const在编译阶段确定它的值。
define不会进行类型安全检查,而const会进行类型安全检查,安全性更高。
const可以定义函数而define不可以。
(12) 在C++中const的用法(定义,用途)
const修饰类的成员变量时,表示常量不能被修改const修饰类的成员函数,表示该函数不会修改类中的数据成员,不会调用其他非const的成员函
数
(13) C++中的static用法和意义
static的意思是静态的,可以用来修饰变量,函数和类成员。
变量:被static修饰的变量就是静态变量,它会在程序运行过程中一直存在,会被放在静态存储
区。局部静态变量的作用域在函数体中,全局静态变量的作用域在这个文件里。
函数:被static修饰的函数就是静态函数,静态函数只能在本文件中使用,不能被其他文件调用,
也不会和其他文件中的同名函数冲突。
类:而在类中,被static修饰的成员变量是类静态成员,这个静态成员会被类的多个对象共用。被
static修饰的成员函数也属于静态成员,不是属于某个对象的,访问这个静态函数不需要引用对象
名,而是通过引用类名来访问。
【note】静态成员函数要访问非静态成员时,要用过对象来引用。局部静态变量在函数调用结束后也不
会被回收,会一直在程序内存中,直到该函数再次被调用,它的值还是保持上一次调用结束后的值。
注意和const的区别。const强调值不能被修改,而static强调唯一的拷贝,对所有类的对象都共用。
(14) 计算下面几个类的大小:
class A {};
int main(){
cout<
空类的大小是1, 在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类
同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个
字节,这样空类实例化之后就会拥有独一无二的内存地址。当该空白类作为基类时,该类的大小就优化
为0了,子类的大小就是子类本身的大小。这就是所谓的空白基类最优化。
空类的实例大小就是类的大小,所以sizeof(a)=1字节,如果a是指针,则sizeof(a)就是指针的大小,即4字
节。
class A { virtual Fun(){} };
int main(){
cout<
因为有虚函数的类对象中都有一个虚函数表指针 __vptr,其大小是4字节
class A { static int a; };
int main(){
cout<
静态成员存放在静态存储区,不占用类的大小, 普通函数也不占用类大小
class A { int a; };
int main(){
cout<
class A { static int a; int b; };;
int main(){
cout<
静态成员a不占用类的大小,所以类的大小就是b变量的大小 即4个字节



