最近准备秋招,需要好好复习C++语言了,准备看着别人面经里的问题复习,索性就记录下来,一是加深印象,另一个也可以供所有人参考。
1.指针和引用的区别
1.内存
- 指针占用内存空间;引用只是一个别名,不占内存空间;
2.初始化
- 指针可以不初始化;引用必须初始化,不初始化会报错;
3.指向
- 指针的指向可以变化,指向不同的对象;引用的指向不可以变化,从一而终;
4.++操作
- 指针的++操作为地址的增加(增加指向类型的字节数);引用的++为指向变量的++操作;
5.sizeof()
- 指针的sizeof()为指针变量(一个地址)的大小;引用的sizeof()为指向变量的大小;
6.层级
- 指针有多级指针;引用只有1级
2.堆和栈的区别
1.管理方式
- 堆是程序员管理(new/delete,malloc/free);栈是编译器管理;
2.空间大小
- 堆是一段不连续的内存空间(链表),大小受可用的虚拟内存影响,空间较大;栈是一段连续的空间大小,大小一般固定(1/2M),空间较小;
3.分配方式
- 堆是动态分配,需手动释放;栈有静态分配和动态分配两种,静态分配(如临时变量,函数参数等)由编译器完成,动态分配(如alloca)由编译器自动释放;
4.分配效率
- 堆的分配由库函数实现,机制复杂,因此效率较低;栈的分配在计算机底层提供支持,分配专门的寄存器存放栈地址,效率较高;
5.生长方向
- 堆向上增长,地址越来越大;栈向下增长,地址越来越小;
6.内存碎片
- 堆频繁的申请和释放内存会造成大量的内存碎片;栈是先进后出,不会造成内存碎片。
3.new和delete是如何实现的,new 与 malloc的异同处
1.new的实现
string* p=new string("hello");
new的实现
//1.分配内存
void* mem=operate new( sizeof(string) );
//2.转型
p=static_cast<string*>(mem);
//3.构造函数
p->string::string("hello");
2.delete的实现
delete p;
delete的实现
//1.析构函数
p->string::~string();
//2.释放内存
operate delete(p);
3.new 与 malloc的异同处
1.属性
- new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持c。
2.参数
- 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
3.返回类型
- new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
4.分配失败
- new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
5.自定义类型
- new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
- malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
6.重载
- C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。
7.内存区域
- new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,比如对new进行重载,分配的内存为已有的栈上的内存,那new就可以不位于堆中,它在栈上。自由存储区是个抽象的概念,它可能在堆,也可能在栈。new的内存=自由存储区。
4.C和C++的区别
感觉这个没有一个标准的答案,感觉区别很大很多,又很细,所以此除只罗列几个吧
1.面向过程OR面向对象
- C语言为面向过程编程语言;C+为面向对象编程语言;
2.关键字不同
- C语言有32个关键字;C++98有63个关键字;
3.函数重载
- C语言没有函数重载;C++支持函数重载。
5.C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
联系:两者均为面向对象编程语言,都具有面向对象的特性,但是C++是对C的扩充,多少影响了面向对象,而Java比较彻底。
区别:
1.指针
- C++具有指针,可以使用指针访问内存;Java中无法使用指针直接访问内存,增加了自动的内存管理功能,有效地防止了指针操作失误,如野指针;
2.多重继承
- C++具有多重继承;Java不具有多重继承,但是可以继承多个接口,实现了多重继承的功能;
3.数据类型及类
- C++中允许将函数和变量定义为类外;Java为完全面向对象的语言,所有函数和变量都是类或者类的一部分;
4.自动内存管理
- C++中使用new动态管理内存时需要手动释放内存;Java自动进行内存回收操作,不需程序员操作;
5.操作符重载
- C++支持操作符重载;Java不支持操作符重载;
6.预处理功能
- C++有一个预编译阶段,支持预处理,虽然提供了方便,但是增加了编译的复杂度;Jav不支持预处理,但是提供的引入语句(import)和预编译的功能类似;
7.字符串
- C++使用'\0'终止符代表字符串的结束;Java中字符串使用类对象来实现;
8.goto语句
- C++支持goto语句,导致程序结构混乱,不易理解;Java虽然指定goto作为关键字,但是不支持它的使用;
9.类型转换
- C++支持数据类型的隐式转换,比如float隐式转换为int;Java不支持隐式类型转换,必须显式进行强制类型转换;
6.struct和class的区别
1.默认继承和默认访问权限
- struct为public,class为private;
2.模板
- class可以定义模板类形参,而struct不可以。
7.define 和const的区别(编译阶段、安全性、内存占用等)
1.编译器处理方式
- define在预处理阶段进行替换;const在编译时确定;
2.类型检查
- define无类型,不进行安全检查,可能会产生意想不到的结果;const有数据类型,编译时会进行类型检查;
3.内存空间
- define不分配内存,给出的是立即数,有多少次就进行多少次替换,在内存中有多个拷贝,消耗内存大;const分配内存(可能在全局静态区,也可能在栈区),在程序运行过程中只有一次拷贝;
4.其他
- 在编译时,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,使它成为一个编译期间的常量,没有存储和读内存,因此效率很高。
8.在C++中const和static的用法(定义,用途)
9.const和static在类中使用的注意事项(定义、初始化和使用)
10.C++中的const类成员函数(用法和意义)
11.计算下面几个类的大小:
class A {}; //sizeof(A) = 1;
class A { virtual Fun(){} }; //sizeof(A) = 4(32位机器)/8(64位机器);
class A { static int a; }; //sizeof(A) = 1;
class A { int a; }; //sizeof(A) = 4;
class A { static int a; int b; }; //sizeof(A) = 4;
12.给一个代码,求输出结果
class A
{
public:
A(int x){}
}
问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)
网友评论