Effective C++ 笔记:4设计与声明

昨晚睡前看的,果然睡前看点书这个习惯要强制性养成的。

条款18 让接口被正确使用,不要被误用

不易被误用,比如Date(1,2,1991)->Date(Day(1),Month(2),Year(1991));以函数代替对象

条款19 设计类犹如设计type

创建和销毁;

copy constructor(定义了pass by value如何实现);

合法值(影响异常的抛出处理);

是否需要配合某个继承图系(inheritance graph,virtual/non-virtual)?

类型转换?

操作符和函数如何设计?

未声明的接口?

有多一般化(如果其实是定义整个types应该定义class template)?

真的需要定义新的type吗(derived class/non-member function可以代替吗)?

条款20 Prefer pass-by-reference

pass-by-value是copy了实际实参的,pass-by-reference(编译器底层)真正传递的是指针。

(1)by-value意味着调用copy constructor/destructor,如果是derived则设计更多。会调用一系列的构造函数和析构函数,代价高。

(2)pass-by-reference避免了slicing(对象切割问题)(类型转换,derived的特性被转化为base类)

[1]内置对象、STL的第二迭代器和函数对象用pass-by-value

条款21 Don‘t try to return a reference when you must return an object

--看到reference声明式应该想想它的另一个名称是什么。

(1)函数类的local对象在函数退出前就被销毁了,reference指向被销毁的值。(无定义行为)

(2)函数内不用local用static,比如:

const Rationa&l operator * (const Rational& lhs,const Rationnal& rhs){static Rational result = lhs*rhs}

调用(a*b)==(c*d)会一直等于true,相当于调用operator==(operator*(a,b),operator*(c,d))

原因:对于static对象创建一次就不会再次创建,由于返回的是reference,*(a,b)和*(c,d)操作的是同一个全局变量result,等价于==(result,result)

条款22 Declare data members  priviate

(1)访问数据的一致性;就是使用方便,每次调用一定加(),第一次写C++小项目一个多项式计算器的时候,getter()、setter()有的成员有,有的没有,代码变长后/修改时每次都要回去查看,麻烦。

(2)封装,通过函数访问,日后即使修改这个成员变量,客户也不知道class内部实现已经变了,神不知鬼不觉。

[*]函数是运行时计算,成员变量是编译时确定。内存吃紧时用函数,要求速度时用成员变量(类似刷题:时间和空间上的权衡)

[*]封装性与代码破坏量成反比。取消public member,所有使用它的客户代码会被破坏;取消protected成员变量,derived class杯破坏

条款23 prefer non-member non-friend functions to member functions

条款24 Declare non-member functions when type conversions should apply to all parameters

只有当参数列于参数表内才可以参加隐式转换。

如果是class A{ 分子a,分母b;opeartor *(const A& c){return a*c.a+b*c.b;} }

result = var * 2   // 相当于var.operator*(2) 参数2杯转化为var的类型

result = 2 * var   // error : 2.operator*(var) int类型没有operator

将operator(cosnt A& a,cosnt A& b){} 即可

条款25 consider support for a non-throwing swap 这个没仔细看

 

时间: 2024-10-14 21:38:49

Effective C++ 笔记:4设计与声明的相关文章

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

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第4章 设计与声明(1)-读书笔记 <Eff

Effective c++(笔记) 之 类与函数的设计声明中常遇到的问题

1.当我们开始去敲代码的时候,想过这个问题么?怎么去设计一个类? 或者对于程序员来说,写代码真的就如同搬砖一样,每天都干的事情,但是我们是否曾想过,在c++的代码中怎么样去设计一个类?我觉得这个问题可比我们"搬砖"重要的多,大家说不是么? 这个答案在本博客中会细细道来,当我们设计一个类时,其实会出现很多问题,例如:我们是否应该在类中编写copy constructor 和assignment运算符(这个上篇博客中已说明),另外,我们是让编写的函数成为类的成员函数还是友元还是非成员函数,

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

条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,"促进正使用"的办法包括接口的一致性,以及与内置类型的行为兼容. 3,"阻止误用"的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这可以防范DLL问题,可以用来自动解除互斥锁. 条款19:设计class犹如设计type 博客地址:http://blog.csd

Effective C++笔记06:继承与面向对象设计

关于OOP 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private,也可以是virtual或non-virtual. 2,成员函数的各个选项:virtual或non-virtual或pure-virtual. 3,成员函数和其他语言特性的交互影响:缺省参数值与virtual函数有什么交互影响?继承如何影响C++的名称查找规则?设计选项有如些?如果class的行为

Effective c++(笔记)之继承关系与面向对象设计

1.公有继承(public inheritance) 意味着"是一种"(isa)的关系 解析:一定要深刻理解这句话的含义,不要认为这大家都知道,本来我也这样认为,当我看完这章后,就不这样认为了. 公有继承可以这样理解,如果令class D以public 的形式继承了class B ,那么可以这样认为,每一个类型为D的对象同时也可以认为是类型为B的对象,但反过来是不成立的,对象D是更特殊化更具体的的概念,而B是更一般化的概念,每一件事情只要能够施行于基类对象身上,就一定可以应用于派生类对

《Effective C++》 读书笔记之四 设计与申明

<Effective C++> 读书笔记之四 设计与申明 条款18:让接口容易被正确使用,不易被误用. 重点: 好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容. "阻止误用"的办法包括建立新类型.限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等. 20

《Effective C++》设计与声明:条款18-条款19

软件设计是"让软件做你想让它做的事情"的步骤和做法.从一般性的构想开始,逐渐清晰,构造细节,最终设计出良好的接口(interface).这些接口而后变为C++的声明. 下面讲的是关于接口设计和声明的做法.设计接口一个很重要的准则是:让接口容易被正确使用,不容易被误用.这是一个大的准则,细化之后包括很多内容:正确性.高效性.封装性.维护性.延展性以及协议的一致性. 条款18:让接口容易被正确使用,不容易被误用 接口是客户和你的代码交换的唯一手段.如果客户正确使用你开发的接口,那自然很好:

Effective C++笔记:构造/析构/赋值运算

条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函数时,编译器会给我们构造默认的. 当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数:当一个基类把它的拷贝赋值函数定义为private时,它的派生类也不无生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值. 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 将拷贝构

Effective C++笔记05:实现

条款26:尽可能延后变量定义式的出现时间 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造成了开始定义的对象并没有被使用,而付出了构造成本来析构成本. 所以我们应该在定义对象时,尽可能的延后,甚至直到非得使用该变量前一刻为止,应该尝试延后这份定义直到能够给它初值实参为止. 这样做的好处是:不仅可以避免构造(析构)非必要对象,还可以避免无意义的default构造行为. 遇到循环怎么办?此时往往我

Effective c++(笔记)----类与函数之实现

上篇博客中集中说明了在设计一个类的时候常遇到的问题,当然博客中还夹杂着我随时想到的一些知识,发现自己写博客没很多人写的好,可能是自己语言不会组织,要么就是写的东西大家不愿意看,反正是有这方面的专业问题或者博客中有什么明显的错误和问题,大家提出来,我也好改进哈! 回归正题,这篇博客就大概的把Effective c++中类与函数这节看到的知识点做个笔记. 设计好一个类后,自己就要去实现这个类(实现类中的成员函数.友元.非成员函数等) 可能大家会遇到以下问题 1.在类的成员函数中,尽量避免返回内部数据