【Effective C++ Sumary】设计与声明

时间:2019-02-11
本文章向大家介绍【Effective C++ Sumary】设计与声明,主要包括【Effective C++ Sumary】设计与声明使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

18.让接口容易被正确使用。for example

class Date
{
public:
    Date(int year,int month,int day);
private:
    int year;
    int month;
    int day;
};

//调用
Date(2,30,2019);
//客户容易把顺序记错不是吗
//我们可以用函数返回来取代数值参数,这样更不容易犯错
struct year{};
struct month{};
struct day{};
Date(year(),month(),day());

最好保证接口一致性,多使用tr1::shared_ptr,可以消除资源管理上的一些错误,防范 Cross DLL problem.

19.设计class 就像 设计一个新 type

需要考虑以下几个问题:

1)新type的对象应该如何被销毁和创建

2)对象的初始化和赋值应该有什么样的区别

3)对象如果被pass by value 意味着什么?copy构造函数应该注意一下指针的copy

4)新type的合法值

5)新type需要配合某个继承体系

6)新type需要什么转换

7)什么操作符和函数对于此新type是合理的

8)什么样的标准函数应该被驳回(声明为Private)

9)谁该取用新type成员,哪些是public,哪些是private

10)什么是新type的未申明接口

11)新type有多一般化

12)真的需要一个新type吗

20.以pass-by-reference-to-const 代替 pass-by-value

当一个derived class对象被pass by value 以base class 那么base class的copy 构造会被调用

这会导致该对象的derived部分被切割,结果肯定不好咯

pass by value 会导致多余的构造和析构函数被调用 影响性能

但是STL迭代器,内置类型,函数对象(对象内重载()运算符,使之行为像函数)还是比较适合pass by value

21.需要返回对象的时候,别返回reference

因为reference可能是函数的一个local对象,函数调用结束后,local对象被销毁,reference就没有意义了

22.将成员变量声明为private

成员变量的封装性和 成员变量的内容改变时锁破坏的代码数量 成反比

protected的封装性并不一定比public高,因为它会影响derived class

23 以non-member,non-friend函数代替member 函数

non-member non friend函数并不会增加访问class 内private成分的函数数量

而且把新家的non-member non-friend函数只要写在一个头文件里,然后添加到之前的命名空间里,就可以轻易拓展

而class 的派生无法做到这一点,因为它们无法访问base class的private成分

24。如果所有的参数都需要类型转换,请把函数写成non-member函数

比如operator*(const int a);

如果写在class内,a默认是第二参数,第一参数是this

所以没有办法把两个参数都做隐式转换

而operator * (const A a,const int b);

non-member函数可以把两个参数都做隐式类型转换

25. 写一个不会抛出异常的swap函数

当std::swap效率不高,可以写一个成员swap,再写一个非成员swap,调用前者

使用swap时,应提前写using std::swap。然后不带任何前缀的调用swap

保证swap是全局最合适的

对用户定义类型,全特化std templates是最好的,但不要在std中添加新的东西,毕竟simplest is best