读书笔记Effective C++03[个人向]

1.为了让接口能被正确使用,a.使用函数顶替对象,通过函数来返回某些参数;b.使用新的class来封装用作参数的数据;c.限制类内可以做的事情,譬如使用const对数据进行限制。

2.当设计一个新的class时,要考虑很多问题:怎样?创建和销毁=构造与析构、初始化|赋值|copying的实现、类内成员的合法值、是否需要继承、是否需要转换、public|private|protected的设置、是否需要泛型化编程等。

3.当函数pass-by-value时,这个形参是由对象的copy构造函数产出,当函数完成时,参数传递的成本是一次对象的copy构造函数调用,一次析构。当形参的内部还包含其他类或者继承自其他类时,构造和析构的次数就更多了。解决办法就是pass-by-reference-to-const。reference-to-const也防止了对象切割的问题,譬如某函数的声明type function(class A),若有一个类class B:public A,此时如果调用function(B)就会导致B的所有特质化的部分全部被切割,构造时会copy成一个A对象。“小型对象”或者内置类型并不代表他们的copying行为代价低,许多STL容器内含的东西之比一个指针多一些,但是复制这种对象却要承担复制指针的每一项东西,那将是非常昂贵的。

4.当必须返回一个对象时,不要返回一个引用,因为这个引用可能是局部对象的引用,该对象无论是在stack上还是在heap上都将是糟糕的,不应该引用的。总结起来就是,当必须在返回一个reference或者一个object之间抉择时,应该选出正确的那一个。一个必须返回新对象的函数,那就直接返回一个新对象。

5.如果类中包含成员变量是public而不是private,用户还要花时间考虑调用时需不需要加小括号,同时使用函数可以实现对成员变量更精确的控制,比如对该变量的读写方式。此外,成员变量如果不封装,那将意味着日后变更将变得十分麻烦。对于一个protected成员变量而言同样如此。因为一旦破坏这个protected变量,它的所有继承者都要遭殃。上述的两种情况都将意味着太多代码需要重写,重新测试,重新编写文档,重新编译。因此,从封装的角度看,只有private和其他不封装。

6.在类中,一个调用许多其他成员函数的member函数带来的封装性,比在类外部写一个调用类中其他成员函数的non-member函数的封装性更低。一个类封装性的程度可以使用可访问私有成员的和函数数量来衡量 ,因此前文中多出来的member函数会更多地访问私有成员,从而导致封装性减弱。稍微说一句的是,上述的non-member函数可以是其他类中的member函数、non-member函数要与该类同属一个namespace。

7.通常一个功能强大的类可能拥有大量的便利函数,某些功能之间并没有任何的编译相依的关系。分离他们的直接做法就是将不同的non-member函数分别声明在不同的头文件。这也正是C++标准程序库的组成方式:每个头文件分别实现std的某些机能。

8.【全特化与偏特化】如果std::swap在程序中效率不高时,可以自定义一个swap成员函数,这个函数不要抛出异常。【条款26】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值