一、默认方法
1.1 总论
这是 CPP 与 Java 的OOP 最不同的地方。对于 Java ,基本上是没有默认的行为的,因为所有的对象其实都是指针,所以只有被定义过的方法会用到,而没有被定义过的方法,我们一点也不担心它会在什么其他地方出现,比如:
Student cnx; // 我们不担心 cnx 内部是怎样的,因为这个就是一个指针
Student qs = cnx; // 我们不担心 qs 与 cnx 的关系,因为只不过是对象指针的赋值,而跟实际的两个 Student 没有关系
System.out.println(qs); // 我们不担心 qs 的字符串化,因为来自 Object 类
classroom.answerQuestion(qs) // 我们不担心 qs 到底是怎么传入的,因为我们知道传入的就是一个指针
...
end of execution // 我们不关心 qs 和 cnx 的释放,因为都是 JVM 负责的
```
但是对于 CPP 来说,这些就都是问题了。
```cpp
Student cnx; // 真的定义了一个 Student 对象,里面的内存情况是啥样的?
Student qs = cnx; // 真的将一个对象复制给了另一个对象,那么是怎么复制的?
string s = qs; // 发生了类型转换,这么多的类型,都是怎么转换的?
answerQuestion(qs) // 我传进去的到底是个什么,我可以修改它吗?
...
end of execution // 谁来释放 cnx 和 qs,没有人管一下吗?
可以看到正是因为 CPP 提供了强大的功能,导致在我们没有给我们的类进行任何设计的时候,给人的感觉就是完全不知道会发生什么?当然程序不会有任何二义性的东西存在,它一定会按照一定的规则去执行的。只不过这个规则被 CPP 隐藏起来了,导致我们入门的时候对于各种东西都十分迷茫。