//条款18:让接口容易被正确使用,不易被误用
// 1.如果客户企图使用某个接口而却没有获得他所预期的行为,那么这个代码就不该通过编译。
// 2.促进正确使用的方法包括接口的一致性,以及与内置类型的行为兼容。
// 3.阻止误用的方法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
// 4.shared_ptr支持自定义删除器,可以方便的用于管理各种资源。 //条款20:pass by reference to const 替换 pass by value
// 1.C++的底层操作会将传引用操作以指针的形式来实现。
// 2.传递const的引用可以避免父对象接收子对象时候面临的子对象被切割的问题。
// 3.传递const的引用可以有效避免无谓的拷贝和销毁操作,在性能上产生优势
// 4.对于内置类型以及STL的迭代器以及STL中的函数对象,对它们而言传递值比传递引用更加适当。对于此条规则,经vs2010测试发现,传值与传引用几乎没什么差别,所以统一使用传引用代替传值是可以的。 //条款22:将成员变量声明为private
// 1.将成员变量声明为private的,这可以赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并让类的设计者以充分的实现弹性。
// 2.切记protected并不比public更具封装性。若子类以public方式继承,则可以通过using轻松改变父类中protected成员的访问权限。 //条款23:以非成员函数、非友元函数替换成员函数
// 1.越少的代码可以访问到类的私有成员数据,那么类的私有成员数据的封装性就越好。
// 如下代码:ClearCTestData()函数被声明为类的非成员函数,使得能访问类的私有成员的函数减少,这就提高了类的数据的封装性。如此当改变了类的数据成员的时候,需要被改变的代码量就会减少。
class CTest
{
public:
CTest() : value0(0), value1(0){} public:
void ClearValue0(){value0 = 0;}
void ClearValue1(){value1 = 0;} private:
int value0;
int value1;
}; void ClearCTestData(CTest &Test)
{
Test.ClearValue0();
Test.ClearValue1();
}
// 2.上述的ClearCTestData()系列函数,通常是作为类的辅助工具提供的,将其声明为类的非成员函数,可以降低编译的依存性。 //条款24:若所有参数都可能需要类型转换,那么最好将其声明为类的非成员函数
//1.如下代码:
class CTest
{
public:
CTest (int nTemValue) : value(nTemValue){}
public:
const CTest operator * (const CTest& tem) const {return CTest(value * tem.value);} //此处之所以不是返回一个引用而是按值返回一个对象,是为了防止引用对象不存在的情况。
int GetValue() const {return value;} //为了使得常量对象也能调用此函数,必须将其声明为常量成员函数。
private:
int value;
}; const CTest FunTest(const CTest &tem0, const CTest &tem1)
{
return CTest(tem0.GetValue() * tem1.GetValue());
} CTest Test0(1);
CTest Test1 = Test0 * 2; //允许通过编译
//CTest Test2 = 2 * Test0; //不允许通过编译
//之所以CTest Test1 = Test0 * 2;能通过编译,是因为发生了隐式类型转换,将2转换为CTest类型
//之所以CTest Test2 = 2 * Test0;不能通过编译,是因为只有参数位于参数列表中,这个参数才能发生隐式类型转换。 CTest Test2 = FunTest(2, 2); //允许通过编译,需要隐式转换的参数都位于形参列表中 //条款25:考虑为类写出一个不抛出异常的swap函数
// 1.swap是一个有趣的函数,原本是STL的一部分,而后来成为异常安全性变成的脊柱,以及用来处理自我赋值的可能性。
// 2.当std::swap对自定义的类型效率不高的时候(比如在这个类型中使用了指针指向了一个内存,如此swap应该交换指针而非交换指针所指对象),提供一个swap成员函数,并确定这个函数不抛出异常
// 3.如果提供一个成员函数swap,那么也该提供一个非成员函数版本的swap来调用成员函数版本的swap。
// 4.不要试图往std命名空间中添加新的成员,这种行为是未定义的。

  

Effective C++ 4.设计与声明的更多相关文章

  1. 《Effective C++》设计与声明:条款18-条款25

    条款18:让接口容易被正确使用,不容易被误用 注意使用const,explicit,shared_ptr等来限制接口. 必要时可以创建一些新的类型,限制类型操作,束缚对象等. 注意保持接口的一致性,且 ...

  2. 【Effective C++】设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  3. Effective C++: 04设计与声明

    18:让接口容易被正确使用,不易被误用 1:理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译:如果代码通过了编译,它的作为就该是客户所想要的. 2:许多客户端的错误可以 ...

  4. 《Effective C++》第4章 设计与声明(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  5. 《Effective C++》第4章 设计与声明(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  6. 《Effective C++》阅读总结(四): 设计、声明与实现

    第四章: 设计与声明 18. 让接口更容易被正确使用,不易被误用 将你的class的public接口设计的符合class所扮演的角色,必要时不仅对传参类型限制,还对传参的值域进一步限制. 19. 设计 ...

  7. EffectiveC++ 第4章 设计与声明

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter4 设计与声明 Designs and Declarat ...

  8. Effective C++笔记:设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  9. Effective C++笔记04:设计与声明

    条款18:让接口easy被正确使用,不易被误用 1,好的接口非常easy被正确使用,不easy被误用.你应该在你的全部接口中努力达成这些性质. 2,"促进正使用"的办法包含接口的一 ...

随机推荐

  1. HTML: a的僞類

    a:link a:visited a:hover a:active css中能夠分別針對a鏈接的4中狀態進行css樣式設置,這四種狀態就是a的僞類,分別是: 普通,訪問後,鼠標放在a鏈接上,鼠標按下未 ...

  2. Bootstrap页面布局13 - BS按钮

    bootstrap中的按钮类 一般可以作为按钮的标签有:<a></a>  <button></button>  <input type='butt ...

  3. http UserAgent

    string uAgent = Request.ServerVariables["HTTP_USER_AGENT"].ToLower();  //获取客户端浏览器的请求 判断 是什 ...

  4. DML以及DQL的使用方法

    DML:数据操作语言 1.插入insert into 单行插入:insert into 表名 (字段名, 字段名,...) values (值, 值, ...) 注:值列表要和字段列表相匹配. ins ...

  5. 运行EFDC出现这样的错误:forrt1:severe<157>:Program Exception-access violation

    经过检查是由于TQSER出现读写错误,原来我的数据输入文件的时间是427天,后来延长到639,但其中有一个点的时间仍然维持在427.故此出现这个错误.EFDC是用Fortran编译的,通过debug才 ...

  6. zepto源码--isEmptyObject,isNumeric,inArray,trim--学习笔记

    1.isEmptyObject,判断对象是否为空对象的函数 定义变量name,遍历传入对象的属性name,如果存在任何属性,则返回false,判定传入的参数为非空对象,否则即为空对象. 2.isNum ...

  7. 【android学习4】Eclipse中Clean作用

    今天修改Servlet中代码,重启服务端程序之后发现没有启作用,于是Clean了一把,果然生效. 查阅资料得知,Eclipse中是根据时间戳去编译代码,如果某个类对应的时间戳没有发生改变就不会重新编译 ...

  8. Linux 下动态库 / 静态库(依赖)

    一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...

  9. map和json之间的转换

    Action中在session中存放了一个map<String,Object>,跳转到a.jsp,a.jsp通过form提交到BAction,BAction可从session中获得map值 ...

  10. threading多线程

    什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一 ...