//可能会考到的C++知识点:
1.new/delete 与 malloc()/free() 的区别?
malloc和free是C语言的标准库函数,new和delete是C++的运算符,他们都用来申请和释放内存,但是new/delete会调用类的构造函数和析构函数。
2. #include<a.h>和#include"a.h" 有什么区别?
#include<a.h>编译器是在标准库路径下开始搜索,#include"a.h"则先从用户目录下搜索,然后找不到再从标准库路径下搜索。
3.在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern "C"?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern"C"来解决名字匹配问题。
4.什么是拷贝构造函数?
它是单个参数的构造函数,其参数是与它同属一类的对象的(常)引用;类定义中,如果未提供自己的拷贝构造函数,C++提供一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员的拷贝
5.什么是深浅拷贝?
浅拷贝是创建了一个对象用一个现成的对象初始化它的时候只是复制了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存); 深拷贝是当一个对象创建时,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但拷贝成员也拷贝分配给它的资源。
6.说一说C与C++的内存分配方式?
1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3)从堆上分配(动态内存分配)程序在运行的时候用malloc或new申请任意多少的内存,程序员负责在何时用free或delete释放内存。动态内存的生存期自己决定,使用非常灵活。
7.C++中引用和指针的区别?
引用是对象的别名, 操作引用就是操作这个对象, 必须在创建的同时有效得初始化(引用一个有效的对象, 不可为NULL), 初始化完毕就再也不可改变, 引用具有指针的效率, 又具有变量使用的方便性和直观性, 在语言层面上引用和对象的用法一样, 在二进制层面上引用一般都是通过指针来实现的, 只是编译器帮我们完成了转换。 之所以使用引用是为了用适当的工具做恰如其分的事, 体现了最小特权原则。
8.C中static有什么作用
(1)隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。
(3)static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0×00,某些时候这一特点可以减少程序员的工作量。
9.C++中const有什么用?
不要一听到const就说是常量,这样给考官一种在和一个外行交谈的感觉。应该说const修饰的内容不可改变就行了, 定义常量只是一种使用方式而已,还有const数据成员,const参数, const返回值, const成员函数等, 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性
10.C与C++各自是如何定义常量的?有什么不同?
C中是使用宏#define定义, C++使用更好的const来定义。
区别:
1)const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到的错误(边际效应)。
2)有些编译器可以对const常量进行调试, 不能对宏调试。
4. 既然C++中有更好的const为什么还要使用宏?
const无法代替宏作为卫哨来防止文件的重复包含。
11.虚函数:
作用:可以让成员函数一般化,用基类的指针指向派生类对象时候,可以使派生类的函数得到调用。是动态绑定的基础。
在类声明的时候有关键字virtal。但是在实现的时候则不能。虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。
12.虚析构函数:
作用:为了解决用基类指针指向派生类对象,并用基类的指针删除派生类对象。
13.重载,覆盖,隐藏
重载:
(1)相同的范围 (2)相同的函数名 (3)参数不同
覆盖:
(1)不同的范围(基类和派生类)(2)相同的函数名 (3)参数相同
隐藏:
(1)如果派生类和基类函数名同名,但参数不同,无论有无virtual,基类都被隐藏
(2)如果派生类和基类函数同名,参数又相同,并且没有virtual,基类被隐藏
14. 如何让一个静态函数调用一个非静态成员:
class a
{
public:
static void FunA( );
private:
int menber;
}
由于静态函数是属于类而不属于类对象,因此我们在用静态函数访问非静态成员时候应该是:
static void FunA(a *_a)
{
_a->menber=1;
cout<<_a-<menber<<endl;
}