《大规模C++程序设计》读书笔记26

定义48:如果一个函数只有单一参数,该参数是一个指向某个对象的引用,并且若不经过显式的转换(cast)就不能从函数体内部获得一个指向同一个对象(或它的一部分)的非const引用,那么这个对象是const正确的(const-correct)

指导方针14:系统中的每一个对象都应该是const正确的。

原则99:从一个const成员函数返回一个非const对象可能会破坏一个系统的const正确性。

定义49:在一个系统中,如果一个只有一个参数(该参数是指向一个系统内的对象的任何子集的const引用)的函数未通过显式转换就不能获得一个指向这些对象中的任何一个(或它们的任何部分)的可写引用,那么这个系统是const正确的。

指导方针15:一个系统应该是const正确的。

定义50:如果一个系统的转换图未包含同时涉及任何一个类型的const和非const版本的循环,那么这个系统是const正确的。

指导方针16:在抛弃const之前(至少)考虑两次。

 

原则100:如果成员函数不是公共的,那么会使普通用户也要接触未绝缘的实现细节。

原则101:所有的虚函数和保护函数都是需要派生类作者考虑的事项。

保护成员函数是明确指定给派生类作者的,保护成员函数迫使普通客户接触实现细节,通常最好避免使用。

 

指导方针17:对于返回一个错误状态的函数来说,整数值0应该总是意味着成功。

原则102:通常函数成功工作只有一种方式,而它失败却又若干种方式;作为客户,我们可以不关心它为什么失败。

原则103:通过加载一个可修改的句柄参数返回一个动态分配对象,比通过非const指针返回那个对象更不容易产生内存泄露。

指导方针18:回答是或否问题的函数应该被适当命名(例如 isValid),并返回一个不是0(“no”)就是1(“yes”)的int值。

若bool类型可用,则应该使用bool类型代替int类型。

指导方针19:避免将结果(从函数通过值返回的)声明为const。

从一个函数通过值返回的结果是右值,就基本类型来说,将一个右值声明为const是冗余的、混乱的,并可能干扰模板实例化。

 

原则104:默认参数可以是函数重载的一种有效替代品,尤其是在不涉及绝缘的地方。

默认参数的一个重要用途是允许开发者方便的添加参数到函数中,不会损坏任何先前存在的、使用了这些函数的程序。

指导方针20:避免那些需要一个未命名临时对象的结构的默认参数。

次要设计规则6:千万不要通过值传递一个用户自定义类型(例如 class、struct 或 union)给一个函数。

可以通过const引用来传递用户自定义类型,可提高运行时性能,枚举类型和所有基本类型通过值来传递是最有效的。

 

指导方针21:通过参数返回值要保持一致(例如,避免声明非const引用参数)。

指导方针22:避免将一个函数的任何参数的地址存储在函数结束后仍会保留的位置;改为传递该参数的地址。

次要设计规则7:永远不要企图删除一个通过引用传递的对象。

指导方针23:如果无论何时一个形参(parameter)通过引用或指针传递其实参(argument)给一个函数,该函数都既不修改也不存储它的可写地址,那么这个形参应该声明为const。

指导方针24:避免将通过值传递给一个函数的形参声明为const。

一个局部拷贝是否被修改是函数的一个实现细节,将其声明为const就在接口上暴露了这个决定,这不仅危及绝缘而且损害可读性。

指导方针25:考虑将那些会激活可修改访问的形参(也许除了那些有默认实参的形参)放在那些通过值、const引用或const指针来传递实参的形参之前。

 

原则105:避免不必要的友元关系(甚至在同一组件内部)可以提高可维护性。

指导方针26:避免给单独的函数授予友元关系。

 

指导方针27:如果函数体产生的对象代码大于同样的非内联函数调用本身所产生的对象代码,那么应该避免将该函数声明为inline。

指导方针28:若你的编译器不会产生内联函数,那么应避免将一个函数声明为inline。

声明inline只是给编译器一个提示,没有办法确保一个函数会被真正内联。无论合适我们提取一个声明为inline的函数地址,都会迫使编译器在使用该地址的编译单元中产生该函数的一个静态(非内联)版本。如果一个声明为inline的函数太大或太复杂,那么它可能不会被内联,控制这一点的算法依赖于编译器。

当一个函数没有内联时,编译器会在每个使用该内联函数的编译单元中都定义一个该内联函数的静态版本,这些多重静态拷贝可能导致可执行程序变得更大且运行更慢(和假定该函数声明为非内联相比)。通常有办法请求一个编译器报告没有被内联的函数。

一个动态绑定的函数调用不能产生内联。当虚调用机制因为使用作用域标识符(::)而失效时,虚函数调用可以被内联。当编译器可以确定具体对象的确切类型时(例如当函数是从对象本身而不是通过一个指针或引用调用时),虚函数调用也可以被内联。在任何一种情况下,编译器都被迫要实现虚函数的一个非内联版本,以便将虚函数的地址存储在虚表中。如果我们不小心,可能会产生这个函数的远不止一个的静态拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俞凡 DeepNoMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值