高质量C++读书笔记(复习用)

发布时间:2020-06-26 03:39:19 作者:zheng_feng
来源:网络 阅读:209

const与#define的比较

1、const常量有数据类型,而宏常量没有数据类型。编译器可以对const进行类型检


查。对宏常量只是字符替换,并会产生意料不到的错误。

2、有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试。


类内需要恒常量时用枚举类型。


如果输入参数以值传递的方式传递对象,则宜改用“const&”方式来传递,这样可以


省去临时对象的构造和析构过程,从而提高效率。


assert是在debug下起作用的宏,检测不应该出现错误的情况。


引用的规则:

1、引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)

2、不能用NULL的引用,引用必须与合法的存储单元关联(指针则可以是NULL)

3、一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)


内存分配方式有三种

1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整


个运行期间都存在。如全局变量,static变量。

2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数


执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效


率很高,但是分配的内存有限。

3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少


的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们


决定,使用非常灵活,但问题也最多。



指针与数组的对比

数组要么在静态存储区被创建,要么在栈上被创建。数组名对应着(而不是指向)一


块内存,其地址与容量在生命期内保持不变,只用数组的内容可以改变。

指针看随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作


动态内存。指针远比数组灵活,但也更加危险。


“野指针”的主要两种成因

1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的


缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么


将指针设置为NULL,要么让它指向合法的内存。

2、指针被free或者delete之后,没有置为NULL,让人误以为是个合法的指针


malloc和new的区别

对于非内部数据类型的对象而言,光用malloc是无法满足动态对象的要求。对象在创


建的同时要自动执行构造函数,但是malloc是库函数而不是运算符,不在编译器控制


权限之内,不能够把执行构造函数的任务强加与malloc。malooc返回值的类型是一个


(void*)的指针。

new是一个运算符,返回值的类型是new的数据的类型。


对于C语言的函数,C++增加了重载、内联、const和virtual四种新机制。其中重载和


内联机制既可以用在全局hasn't也可以用在类的成员函数,const与virtual机制仅用


于类的成员函数。


重载函数:作用域必须相同,只能靠参数的不同不能靠返回值的不同来区分重载函数


重载与覆盖

成员函数被重载的特征:

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

2、函数名字相同;

3、参数不同;

4、virtual关键字可有可无;


覆盖是指派生类函数覆盖基类函数,特征是:

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

2、函数名字相同;

3、参数相同;

4、基类函数必须有virtual关键字;


隐藏是指派生类的函数屏蔽了与其同名的基类函数。

1、如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有无virtual关


键字,基类的函数将被隐藏(注意别与重载混淆)。

2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类没有virtual关


键字。此时,基类的函数被隐藏(注意与覆盖混淆)。


参数缺省值只能出现在函数的声明中,不能出现在定义体中。

有多个参数缺省参数只能从后向前缺省。


构造函数、析构函数与赋值函数是每个类最基本的函数。


构造函数初始化的使用规则:

1、如果存在继承关系,派生类必须在其初始化表里调用基类的构造函数。

2、类的const常量只能在初始化表里被初始化,因为它不能在函数体内用复制的方式来初始化。

3、类的数据成员的初始化可以采用初始化表或函数体内赋值的两种方式,这两种方式的效率不完全相同。

非内部类型的成员对象应当采用第一种方式初始化,以获取更高的效率。


基类的构造函数、析构函数、赋值函数都不能被派生类继承。

派生类的构造函数应在其初始化表里调用基类的构造函数。

基类与派生类的构造函数应为虚(vritual)。

在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值。


const修饰参数的用法:

对于非内部数据类型的输入参数。应该将“值传递”的方式改为“const引用传递”,目的是提高效率。

对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。不但没有提高效率,又降低了函数的可读性。


用const修饰函数的返回值:

如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不鞥被修改。该返回值只能被赋给加const修饰的同类型指针。

如果函数返回值采用“值传递”的方式,由于函数会把返回值复制到外部临时的存储单元中,加const没有任何价值。

函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目地是为了实现链式表达。


const成员函数:

任何不会修改数据成员的函数都应该声明为const类型。const关键字只能放在函数声明的尾部。



推荐阅读:
  1. 【读书笔记】ORACLE 内存管理
  2. 为Yaconf的添加测试场景(练习用)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

基础 规则 语法

上一篇:前端学习的工具

下一篇:java 手工实现ArrayList版本一

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》