再读C++的设计艺术(5)
1 public 接口
例如一个类里面维护了一个数组,然后写了一大堆public函数,来操作这个数组。既然可以直接操作 数组,为什么要将其封装提供接口呢?好处就是提供接口,面向接口编程,松耦合,更容易复用。并且 将其物化后,提供接口跟别人交互,更像是一个人用语言去跟别人交流。并且将数据封装,更好的保护 了数据,不将其暴露出来。
2 构造函数
2.1 为什么要对象自动调用构造函数,而不是外部调用?
猜测:面向对象是尽量将一个类进行物化,它自己就是一个物,产生之后就是一个完整的物体,而不需要别人调用构造函数来进行物体的组装,初始化等。
面向对象,一切皆对象,里面是物与物之间的交互,模拟人类社会,如果一个物产生之后还需要别的物来调用它的函数将它初始化,这是非常诡异的。所以一个对象应该在它被使用之前就初始化好了,它不应该由对象的使用者来初始化。
2.2 为什么要设计构造函数,析构函数?
- 更好的体现“物化”思想(自动性)。
- 更好的封装性,避免从外部初始化。很显然外部初始化对象的成员变量破坏了对象的封装性。
- 更有效地使类架构设计与程序架构设计分开。
- 促进更清晰地面向接口编程(所谓的接口都是public的函数),更有效地复用。
2.3 拷贝构造函数中可以访问引用对象的私有变量
因为C++的封装层次达到类的层次,而不是对象。所以对于C++来说访问权限是针对“类” 来说的。也就是说private的访问权限是其他类不能访问的,而不是这个类的不同对象之间不能访问。
2.4 函数特性
构造函数可以显示调用,匿名对象。
构造函数没有返回值,是编译器造出来自动调用用来初始化对象的,它不需要返回值,返回给谁呢?
析构不能重载,不能显示调用。
3 new 与 malloc
new和delete是操作符,不是函数。
malloc函数只是分配出一块内存,而不管分配出什么类型的。需要什么类型 自己去强转。
而new操作符不但分配了内存,并且赋予了其类型,引发其构造函数的调用。
4 方法论
在当解决问题时,会遇到问题难度大于自己能力的情况。此时人们采取的方法有两种:
一种是提升自己的能力,快速学习相关知识等。但是能力并不是短时间能够提升的。能力的提升是金字塔状的,一层一层铺上去的。真正的大师站在金字塔的顶端的时候,底下是铺了一大层的;
第二种就是将问题的难度往下缩。缩小的办法之一就是去掉问题包装层,留下问题最主要的东西,是它的最小完备集。
看传记,最好是看大师本人写的,不要去看其他阿猫阿狗写的,他们怎么可能理解大师所想的。
书读了十几年,是时候去动脑思考问题了。
遇到一个问题有没有能力去解决,就看你有没有能力去将问题解剖,然后用已学过的知识去分析。
世界的本原是相通的,所以所有的知识都是相通的,那么就可以用自己学过的知识去解决其他陌生领域的问题。
通过这个思想,那么你是否可以通过十五天的时间去成为某个其他领域的专家?
因为知识是相同的,思想是相通的,世界的本原是相通的。