effective c++的老笔记(三)

编程入门 行业动态 更新时间:2024-10-17 19:27:13

effective c++的老<a href=https://www.elefans.com/category/jswz/34/1770047.html style=笔记(三)"/>

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++的老笔记(三)

本文发布于:2024-03-12 11:49:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1731447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记   effective

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!