再读C++的设计艺术(5)

Posted by Johan Niu on April 22, 2018

再读C++的设计艺术(5)

1 public 接口

例如一个类里面维护了一个数组,然后写了一大堆public函数,来操作这个数组。既然可以直接操作 数组,为什么要将其封装提供接口呢?好处就是提供接口,面向接口编程,松耦合,更容易复用。并且 将其物化后,提供接口跟别人交互,更像是一个人用语言去跟别人交流。并且将数据封装,更好的保护 了数据,不将其暴露出来。

2 构造函数

2.1 为什么要对象自动调用构造函数,而不是外部调用?

猜测:面向对象是尽量将一个类进行物化,它自己就是一个物,产生之后就是一个完整的物体,而不需要别人调用构造函数来进行物体的组装,初始化等。

面向对象,一切皆对象,里面是物与物之间的交互,模拟人类社会,如果一个物产生之后还需要别的物来调用它的函数将它初始化,这是非常诡异的。所以一个对象应该在它被使用之前就初始化好了,它不应该由对象的使用者来初始化。

2.2 为什么要设计构造函数,析构函数?

  1. 更好的体现“物化”思想(自动性)。
  2. 更好的封装性,避免从外部初始化。很显然外部初始化对象的成员变量破坏了对象的封装性。
  3. 更有效地使类架构设计与程序架构设计分开。
  4. 促进更清晰地面向接口编程(所谓的接口都是public的函数),更有效地复用。

2.3 拷贝构造函数中可以访问引用对象的私有变量

因为C++的封装层次达到类的层次,而不是对象。所以对于C++来说访问权限是针对“类” 来说的。也就是说private的访问权限是其他类不能访问的,而不是这个类的不同对象之间不能访问。

2.4 函数特性

构造函数可以显示调用,匿名对象。

构造函数没有返回值,是编译器造出来自动调用用来初始化对象的,它不需要返回值,返回给谁呢?

析构不能重载,不能显示调用。

3 new 与 malloc

new和delete是操作符,不是函数。

malloc函数只是分配出一块内存,而不管分配出什么类型的。需要什么类型 自己去强转。

而new操作符不但分配了内存,并且赋予了其类型,引发其构造函数的调用。

4 方法论

在当解决问题时,会遇到问题难度大于自己能力的情况。此时人们采取的方法有两种:

一种是提升自己的能力,快速学习相关知识等。但是能力并不是短时间能够提升的。能力的提升是金字塔状的,一层一层铺上去的。真正的大师站在金字塔的顶端的时候,底下是铺了一大层的;

第二种就是将问题的难度往下缩。缩小的办法之一就是去掉问题包装层,留下问题最主要的东西,是它的最小完备集。
看传记,最好是看大师本人写的,不要去看其他阿猫阿狗写的,他们怎么可能理解大师所想的。
书读了十几年,是时候去动脑思考问题了。
遇到一个问题有没有能力去解决,就看你有没有能力去将问题解剖,然后用已学过的知识去分析。
世界的本原是相通的,所以所有的知识都是相通的,那么就可以用自己学过的知识去解决其他陌生领域的问题。
通过这个思想,那么你是否可以通过十五天的时间去成为某个其他领域的专家?
因为知识是相同的,思想是相通的,世界的本原是相通的。