□第一节 什么是接口?什么是接口?百度百科的解释:两个不同系统(或子程序)交接并通过它彼此作用的部分.接口的概念贯穿于整个软件开发过程中,本文讨论的接口概念仅局限于以C++实现的class,function等. class接口 以OOP的思想,现实的问题总能抽象成一个个class,这些class包含哪些属性,方法其实就是class接口要考虑的问题.function接口 class接口的操作就是通过一个个function来实现的,function的参数传递,返回值是function接口要考虑的问题…
问题聚焦:     从这个条款开始,我们把注意力转移到软件设计和声明上来,具体的说就是,C++接口的设计和声明.     所谓软件设计,就是以一般习惯的构想开始,演变成细节的实现,最终开发针对性的特殊接口.     接口的设计和声明的一个最基本的准则是:让接口容易被正确使用,不容易被误用.     引入新类型是预防接口被误用的常见手段之一. 欲开发一个好的接口,首先必须考虑客户可能做出什么样的错误. 来看下面这个例子 class Date { public: Date(int month, in…
1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些“讲道理”的人员,这些客户尝试把工作做好,他们希望能够正确使用你的接口.在这种情况下,如果接口被误用,你的接口应该至少负一部分的责任.理想情况下,如果使用一个接口没有做到客户希望做到的,代码应该不能通过编译:如果代码通过了编译,那么它就能做到客户想要的. 2. 编写好的接口的方法列举 2.1 使接口不容易被误用——通过引入新的类型 开发出容易被正确使…
好的接口容易被正确使用,不易被误用 考虑以下函数: void func(int year,int month,int day){ //一些操作 } 这个函数看似合理,因为参数的名字已经暴露了它的用途.但是如果只有寒暑签名呢?如下: void func(int,int,int); 就算我告诉你,此处需要日期作为参数,你可能会以月日年.日月年等不同形式作为参数. 正确的做法是把年月日都各自抽象为一个类(或者说是结构体): struct Year { int year; }; struct Month…
NOTE : 1.好的接口容易被正确使用,不容易被误用.应该让所有接口努力达成这些性质. 2.“促进正确使用”的办法包括接口的一致性,以及内置类型的行为兼容. 3.“阻止误用”的办法包括建立新类型/限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4.tr1::shared_ptr 支持定制型删除器(custom deleter).这可以防范DLL问题,可以被用来自动解除互斥锁(mutexs)等等.…
好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. tri::shared_ptr支持定制型删除器(custom deleter).这可防范DLL问题,可被用来自动解除互斥锁(mutexes;见条款14)等等.…
一个简答易错的例子 class Date { public Date(int month,int day,int year); } 一年后使用这个接口的时候,写了Date d(15,10,2015)或者Date d(2015,10,15),准确的应该是Date d(10,15,2015),欧,多么低级的错误,花了我一个早上的时间去调试这个bug. 解决的方法 为参数声明自定义类型 struct Day { explicit Day(int d):val(d) {} int val; }; str…
public继承从根本上讲,有两部分:接口继承和实现继承.两者之前的区别很像函数声明与函数定义. 具体设计中,会呈现三种形式:derived class只继承成员函数的接口(纯虚函数):derived class同时继承函数的接口和实现,同时能够重写(override):derived class同时继承函数的接口和实现,但是不允许重写该函数. 1.只继承成员函数的接口(纯虚函数): 例如pure函数 2.同时继承函数的接口和实现,同时能够重写(override): 例如impure函数,为了避…
test* create_test(); shared_ptr<test> create_test();//下面的接口比上面的接口要好 auto_ptr<test> create_test(); { shared_ptr<test> p(new test()); return p; }…
类和接口 使类和成员的可访问性最小 信息隐藏(information hiding)/封装(encapsulation):隐藏模块内部数据和其他实现细节,通过API和其他模块通信,不知道其他模块的内部工作情况. 原因:有效地解除各模块之间的耦合关系 访问控制机制(access control):决定类,接口和成员的可访问性.由声明的位置和访问修饰符共同决定. 对于顶层的类和接口,两种访问级别: 包级私有的(package-private) 公有的(public) 对于成员(域,方法,嵌套类,嵌套…