C/C++(30)有个词叫条款

1、对于单纯变量,最好以const对象或是enums 替换 #defines.
2、对于形似函数的宏(macros),最好改写成inline函数来替换 #defines.
3、将某些东西声明为const可以帮助编译器侦测出错误的用法。const可被加于任何作用域内的对象、函数参数、函数返回类型、函数成员体系。
4、编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)。
5、当const和non-const 成员函数有着实质性的等价实现时,令non-const版本调用const版本可以避免代码重复。
6、为内置型对象进行手工初始化,因为C++不保证初始化它们。
7、构造函数最好使用成员初始列表(member initialization list),而不要在构造函数体内使用赋值操作(assignment)。初始列列出的成员变量,其排列次序应该和他们在Class 中声明的次序相同。
8、为避免“夸编译单元之初始化次序”问题,请以local static 对象替换non-local static 对象。
9、编译器可以暗自为class创建default 构造函数,copy构造函数、copy assignment 操作符,以及析构函数。
10、为了驳回编译器自动(暗自)提供的(构造函数。。。)的机能,可以将成员函数声明为private 并且不予实现,使用像Uncopyable 这样的base class 也是一种做法。
11、polymorphic(带多态性质的)base class应该声明一个virtual 析构函数。如果 class 带有任何virtual 函数,他就应该拥有一个virtual析构函数。
12class 的设计的目的如果不是作为base classes 使用,或不是为了具备多态性(polymorphically),就不应该声明virtual 析构函数。
13、析构函数绝对不要吐出异常,如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下他们(不传播)或是结束程序。
14、如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
15、在构造和析构期间不要调用virtual 函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层)。
16.inline是编译时的行为,虚函数是在程序执行时的行为,静态成员函数只能访问静态数据成员 
17.关于内联函数的(error LNK2019 无法解析的外部符号)。通常编写函数时,会把声明放到头文件(*.h)中,而把函数定义放在源文件(*.cpp)中,在其他源文件中使用时包含对应的头文件即可。但是内联函数(inline)不要定义在cpp文件中,因为我们通常都是包含头文件,而编译器在编译时会对内联函数进行展开操作,但是编译器只能在包含的头文件里搜索函数的定义体,如果头文件只有声明,显然编译器不知道该如何展开,于是就出错了。每一个使用内联函数的地方,都应该知道内联函数的定义,所以内联函数就直接定义在头文件中。
第一章 从C转向C++
条款1:尽量用constinline而不用#define
条款2:尽量用而不用
条款3:尽量用newdelete而不用mallocfree
条款4:尽量使用c++风格的注释
第二章 内存管理
条款5:对应的newdelete要采用相同的形式
条款6:析构函数里对指针成员调用delete
条款7:预先准备好内存不够的情况
条款8: 写operator newoperator delete时要遵循常规
条款9: 避免隐藏标准形式的new
条款10: 如果写了operator new就要同时写operator delete
第三章 构造函数,析构函数和赋值操作符
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
条款12: 尽量使用初始化而不要在构造函数里赋值
条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
条款14: 确定基类有虚析构函数
条款15: 让operator=返回*this的引用
条款16: 在operator=中对所有数据成员赋值
条款17: 在operator=中检查给自己赋值的情况
第四章 类和函数:设计与声明
条款18: 争取使类的接口完整并且最小
条款19: 分清成员函数,非成员函数和友元函数
条款20: 避免public接口出现数据成员
条款21: 尽可能使用const
条款22: 尽量用“传引用”而不用“传值”
条款23: 必须返回一个对象时不要试图返回一个引用
条款24: 在函数重载和设定参数缺省值间慎重选择
条款25: 避免对指针和数字类型重载
条款26: 当心潜在的二义性
条款27: 如果不想使用隐式生成的函数就要显式地禁止它
条款28: 划分全局名字空间
第五章 类和函数: 实现
条款29: 避免返回内部数据的句柄
条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
条款32: 尽可能地推迟变量的定义
条款33: 明智地使用内联
条款34: 将文件间的编译依赖性降至最低
第六章 继承和面向对象设计
条款35: 使公有继承体现 "是一个" 的含义
条款36: 区分接口继承和实现继承
条款37: 决不要重新定义继承而来的非虚函数
条款38: 决不要重新定义继承而来的缺省参数值
条款39: 避免 "向下转换" 继承层次
条款40: 通过分层来体现 "有一个""用...来实现"
条款41: 区分继承和模板
条款42: 明智地使用私有继承
条款43: 明智地使用多继承
条款44: 说你想说的;理解你所说的
第七章 杂项
条款45: 弄清C++在幕后为你所写、所调用的函数
条款46: 宁可编译和链接时出错,也不要运行时出错
条款47: 确保非局部静态对象在使用前被初始化
条款48: 重视编译器警告
条款49: 熟悉标准库
条款50: 提高对C++的认识 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值