笔记(三)"/>
effective c++的老笔记(三)
条款二十二
1、务必对成员变量使用private,然后用函数读取它们,看似多次一举,实际上使用函数读取可以保证每次都进行正确的值检测,并且可以在用户无需了解的情况下计算/读取方式、可以细微得划分只读/只写。
type getNum(){}
这个函数返回的可以是一个成员的值,这个成员储存了需要的值(在内存次要时)
return member;
也可以在函数内调用相应的成员进行计算(在内存重要,调用次数不多时)
{
//计算
return result;
}
2、protected的封装性并没有比public好,protected中改变一个成员,破坏的是所有派生类,public则是,鬼晓得!只有private(封装)与其他(不封装),这两种封装性。
条款二十三
使用non-member函数来代替member(前提是可以)
把需要使用private成员的函数放在类里,调用一系列成员函数完成某种功能的“便利函数”定义成non-member会更好。
这样做可以避免用户去编译他们不需要的功能。若把所有的“便利函数”放到类里,那么就意味着用户要编译全部的功能。
可行的做法是把“仅仅调用成员函数的函数”放在和定义的类所在的同一个命名空间中。然后把命名空间在不同的文件展开,把不同的功能的函数放在不同的头文件中。这么做用户便只需要编译他们想要的功能部分,和必须编译的类部分。
故使用non-member函数代替member函数,可以增加封装性、包装弹性、机能扩充性。
条款二十四
如果一个函数的全部参数都可以进行类型转换,那么它只能是一个非成员函数(这些类型转换通常是单一参数的构造函数定义的隐式转换,也就是其他类型到本类型的转换)
比如operator*定义成成员函数则会导致“数值 * 类型”无法通过编译,因为operator*的第一个参数绑定了“类型”,所以只能以 “类型 * 数值”的方式使用operator*,此时就应当改成非成员函数(通过友元等实现)。
条款二十五
使用一个编写正确,不抛出异常的swap
标准库的swap实现
template<typename T>
void swap(T& lhs, T& rhs)
{T temp(lhs);lhs = rhs;rhs = temp;
}//拷贝并交换
简单的拷贝并交换,可能引起三次拷贝交换,因为operator=通常都需要“拷贝并交换”。也就是说,当你swap时,虽然只有三句代码,但是第一句调用了拷贝构造函数进行一次拷贝,后两句调用了operator=进行了“拷贝并交换”又发生两次拷贝(额外的临时对象)。
那么当你不需要这样的交换时,定义一个自己的版本,比如只交换内置指针,而不是构造三次对象。
对于非template类,即非模板类
定义一个swap()成员函数,再定义一个非成员函数(接受两个参数的)来调用这个函数,接着再定义一个对std::swap的偏特化版本,最好和这个类放在一起,因为使用这个类的客户应该都会需要它的偏特化swap。
namespace ForSwapStuff {class ForSwap {public:void swap(ForSwap& rhs){int *temp = pointer;pointer = rhs.pointer;rhs.pointer = temp;}//成员函数交换private成员private:int *pointer;};void swap(ForSwap& lhs, ForSwap& rhs){lhs.swap(rhs);}//非成员函数调用public swap
更多推荐
effective c++的老笔记(三)
发布评论