C++知识梳理

一、new、delete、malloc、free关系

1.      都是在堆上进行内存操作

2.      new和delete能动态申请和释放内存

3.      new和delete能调用构造和析构函数

4.      malloc指定内存分配的字节数

5.      new是强制类型,malloc不是,需要类型转换

6.      malloc和free是库函数,new和delete只是运算符

 

二、堆和栈的区别

1.      栈:编译器自动分配和释放

2.      堆:程序员手动分配和释放

举例 char *p = new char[10]或char *p =(char*)malloc(10),

p是存放在栈,new与malloc分配的内存,放在堆上

 

三、delete和delete[]区别

1.      delete删除对象,指针。delete[]删除数组

2.      delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数

3.      delete与new配套,delete []与new []配套

 

四、C++哪些特性,分别的意义是什么

1.      封装:

1)  将客观事物抽象成类,每个类有相应的属性和方法

2)  可使类的定义和实现分离,提高隐蔽性

2.      继承

1)  派生类直接使用基类的属性、方法和实现(实现继承)

2)  仅使用属性和方法,实现滞后到派生类中实现(接口继承)(抽象类)

3.      多态

1)     基类指针(引用)根据赋给它的不同的派生类指针(引用),动态的调用属于子类的该函数

2)     提升代码的模块化(隐藏);提升代码的扩展性(代码重用)

 

五、基类和派生类之间构造与析构的顺序

顺序:基(构造)->派生(构造)->派生(析构)->基(析构)

 

六、虚函数和纯虚函数

1.      虚函数:关键字virtual,基类可以实现,派生类可以继承也可以重写

2.      纯虚函数:virtual函数名=0,该类为抽象类,不能实例化,必须被派生类重写才能使用

 

七、什么是引用,使用引用时要注意哪些问题

1.      引用就是变量或对象的一个别名

2.      无需分配内存

3.      主要用作函数的形参

注意

1.      声明引用时需要初始化

2.      初始后无法再赋值

 

八、将“引用”作为函数参数有哪些特点?

1.      别名

2.      无需分配内存

3.      用引用后,函数直接使用原始数据,而不是拷贝

4.      传递对象或结构体变量一般都使用引用。

 

九、在什么时候需要使用“常引用”?

1.      提升程序效率(引用)

2.      保护数据在函数中不被改变(const)

 

十、“引用”与多态的关系?

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

 

十一、       “引用”与指针的区别是什么?

1.      指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作(间接)

2.      引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作(直接)

 

十二、       结构与联合有和区别?

1.      结构体内数据分配不同地址空间,赋值互不影响

2.      共同体内公用一块地址空间,同一时刻,只能存储一个成员

 

十三、       重载(overload)和重写(覆盖)的区别?

1.      重载:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

2.      重写:

(1)不同的范围(分别位于基类与派生类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

 

十四、       main 函数执行以前,还会执行什么代码?

全局对象的构造函数会在main 函数之前执行

 

十五、       struct 和 class 的区别

1.      struct 的成员默认是公有的,而class成员默认是私有的

2.      class特性:封装、继承、接口,这些是struct没有的

3.      class有默认指针this,struct没有

 

十六、       请说出const与#define 相比,有何优点?

1.      const定义的常量有数据类型

2.      const修饰的变量无法修改

 

十七、       简述数组与指针的区别?

1.      数组可以在栈上创建(局部),或在静态存储区(全局)

2.      只能能指向任意类型的内存块

3.      sizeof(数组名)数组的总字节数          sizeof(指针)一个指针变量的字节数

4.      当数组名作为函数的参数进行传递时,sizeof(数组名)同样是一个指针变量的字节数

 

十八、       static有什么用途?

1.      静态的变量在函数调用过程中保持其值不变。

2.      限制变量的作用域(文件或代码块)

3.      设置变量的存储域

4.      static可以修饰函数,限定函数只能在限定范围内使用

5.      类中成员用static修饰后,对其他继承的类是隐藏的

6.      类中成员函数只能访问类的static成员变量

7.      自动初始化为0

8.      如果设为全局,那么函数调用后,下次调用时仍维持上次的值

 

十九、       引用与指针有什么区别?

1.      声明时,引用必须被初始化,指针不必

2.      引用初始化以后不能被改变,指针可以改变所指的对象

3.      不存在指向空值的引用,但是存在指向空值的指针

 

二十、       全局变量和局部变量在内存中是否有区别?

1.      全局变量储存在静态数据区

2.      局部变量在堆栈中

 

二十一、             局部变量能否和全局变量重名

能,函数内局部变量会屏蔽全局变量。要用全局变量,需要使用"::"

 

二十二、             什么是预编译,何时需要预编译

预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

 

 

二十三、             关键字const是什么含意?

1.      只读

 

const int a;

a是一个常整型数

int const a;

a是一个常整型数

const int *a;

a是一个指向常整型数的指针(整型数是不可修改的,但指针可以)

int * const a;

a是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)

int const * a const;

a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值