这几天有点无聊,就随便写点什么吧。
提一下,目前我在这儿写的东西都是面向程序员的,内容多和程序设计相关,见谅。
觉得学习就是一个循序渐进的过程,认真地一步步走下去,渐渐地就会有所收获。
因为好久没写 C++ 代码了,这几天空闲时间把 C++ Primer 拿出来温习了一下,也把 Effictive C++ 3th 看了一遍。感想就是在理解一门编程语言的独有思想之前,是很难发挥这门语言的强大力量,也难以理解它是如何运作的。看到自己 16 年暑假前期写的那几段 C++ 代码,也正好证实了这一点。这次阅读算是小有收获,对 C++ 面向对象编程的 is-a 和 has-a 也不再困惑了,举个有关 is-a 概念的例子:
class Person {
public:
void eat();
private:
// ...
};
class Student : public Person {
public:
void doHomework();
private:
// ...
};
公有继承 (public inheritance) 要展现出 is-a (是一种,是一个) 的关系,上面的例子就是一个比较清晰的展示:“学生是一个人”,“学生”可以做“人”能做的事情,比如“人”需要吃饭,“学生”也需要吃饭。但反过来就不必满足,“学生”要写作业,但并非所有的“人”都要写作业。所以 class Student
可以看作是 class Person
的特化版本。当然,这个例子展示的,只是一般意义上的自然语言逻辑,其实有些继承关系在程序语言中并没有这么清晰,甚至有点反直觉,因为程序语言要求精确无歧义,而自然语言不一定能做到。所以不错的做法就是,保证继承自基类 (base class) 的所有操作都能在派生类 (derived class) 上正确无误地执行,这样可以有效避免设计出错误的继承体系。
上面聊了 C++ 的继承关系,这里也稍微提一下多重继承 (multiple inheritance),因为去年暑假写的那几段 C++ 也用到了这个。多重继承是派生类含有多个基类的继承体系。多重继承会比单一继承的逻辑更复杂,也更容易导致忘记初始化成员变量。而且在继承体系内,如果出现重复继承,还需引入虚继承来解决。所以除非情况适用,否则最好不去使用多重继承。
这里说一句老生常谈的话:学习编程语言最重要的一点就是多练。
在练习的过程中,慢慢就会发现自己有什么不清楚的地方,这时再去查阅相关资料,疑惑就很容易解决了。比如我几年前写 C 程序的时候,对一些概念比较朦胧,比如:为什么 inline 函数和结构体 (struct) 可以放头文件里?指针指向的地址与指针的地址的区别,还有指向指针 (pointer) 的指针的取值取址。但这些都在练习中慢慢清晰起来了。我觉得要理解这些细节,光看书可能是不行的,因为多数书籍限于篇幅,对这些细节只是一语带过,而且不是自己实践得出的结论,也不会足够深刻。去写写代码,看看编译器和程序的输出,慢慢地,一切就会清晰起来。
当然,编程语言只是程序设计的一部分,学会一门语言并不代表一定能写出好的程序,但在适用的场景下,一定会让使用者更加得心应手。
就这样吧。