高质量C++/C编程指南阅读笔记(二)

1.   内存管理

   a)    内存分配

               i.         静态内存分配,编译时分配好,整个运行期间存在,static,全局变量

              ii.         栈上创建,运行时分配,运行后释放,局部变量

             iii.         动态内存分配,堆上,malloc,new,free,delete,周期程序员决定

   b)    常见内存错误

               i.         未分配成功便使用,NULL检查

              ii.         未初始化就引用,不一定默认0

             iii.         虽然分配成功并初始化,但越界

             iv.         malloc必须数量与free数目一致,否则内存泄露

              v.         释放后继续使用,典型的是free或者delete后没有置为NULL,野指针

   c)    数组与指针

               i.         数组创建在静态存储上或者栈上,对应一块内存区(不是指向)

              ii.         常量数据用指针代替数组时,不能修改,因其存在于静态存储区

             iii.         sizeof(数组)等同于sizeof(typeof(数组))

             iv.         不要用return返回指向栈内存的指针,函数结束时候自动消亡

              v.         free和delete后,指针指向的内存是垃圾,而指针本身不是空,野指针

             vi.         指针消亡,其对应内存不一定自动释放

            vii.         内存释放,指针不一定成NULL指针

    d)    malloc free new delete

               i.         有了malloc free为何还需要new delete:首先,malloc free 被c/c++所支持,而new delete仅为c++支持,其次,malloc free是标准库函数,而new delete是运算符,有了malloc free无法满足非内部数据对象的要求,因为对象在创建时要自动执行构造函数,而在消亡时要自动执行析构函数,标准库函数不在编译器控制权限范围内,而new delete是运算符

              ii.         malloc free的存在合理性:c++经常需要调用c的函数,而c只能调用malloc free来管理内存

             iii.         不管如何,内存耗尽必须退出exit(1),判定常常是根据申请不到空间

             iv.         对于对象数组,new obj[],释放时必须为delete [ ]obj

2.   C++函数高级特性

   a)    当心隐式变换,导致重载二义性

   b)    重载与覆盖:

               i.         重载:相同范围,函数名字相同,参数不同,virtual关键字可有可无

              ii.         覆盖:范围不同(分别在派生类和基类中),函数名字相同,参数相同,基类必须有virtual

   c)    隐藏:如果派生类函数与基类函数同名,但参数不同,基类被隐藏;如果派生类函数和基类函数同名,且参数相同,但基类函数没有virtual,则基类函数被隐藏

   d)    参数缺省值:

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

              ii.         函数多个参数,从后向前缺省

   e)    运算符重载:

               i.         如果被重载为全局函数,一个参数叫一元运算符等

              ii.         如果被重载为类函数,一元运算符没有参数,因为对象自己为左侧参数等

             iii.         = ,[], (),->只能重载为成员函数

             iv.         不能对已有数据类型,’.’及无法定义有先级的符号重载

   f)     内联函数:

               i.         工作机制:检错,直接替换函数调用,效率

              ii.         相对于宏来说优点,安全性,自由操作类成员

             iii.         inline与函数定义体放在一起,不一定要与声明一起,为用于实现的关键字

3.   类的拷贝、构造、赋值函数

   a)    缺省函数:无参构造函数、拷贝构造函数、析构函数、赋值函数

   b)    构造函数:

               i.         如果存在继承,在派生类的构造函数表调用基类的构造函数

              ii.         类的const参数只能在构造函数表中初始化,无法在函数体内赋值

             iii.         类的数据成员可以再构造函数表或者函数体内初始化,效率考虑的话,非内部数据成员使用构造函数表初始化

   c)    如果不定义构造函数和析构函数,会自动以位拷贝方式生成缺省函数,如果类里面有指针,则出错

   d)    拷贝构造函数只有在创建时使用,赋值函数只能被已经存在的对象调用

   e)    基类与派生类的析构函数应该为virtual

   f)     编写派生类的赋值函数时,需要对基类的数据成员重新赋值

4.   类的继承与组合

   a)    继承规则:逻辑上B是A的一种,A的所有功能对B都有意义,允许继承

   b)    如果逻辑上A是B的一部分,则不允许B从A派生,而要用A和其他组合成B

5.   其它编程经验

   a)    const用法

               i.         使用const修饰函数的参数(对于内部数据类型,无须将const int x改为const int &x),因为内部类型不存在构造析构过程

              ii.         const 修饰函数返回值

                      1.    使用指针返回,只能赋值给const修饰的指针

                      2.    使用值返回,无区别

                      3.    引用返回一般为了链式传递

             iii.         const成员函数,保证不会修改成员数据,加在函数声明尾部

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值