复习 C 和 C++

为了把精力集中到应用软件的开发,并且基于面向对象编程易维护和图形界面、闭源要求等方面的考虑,初步决定用 Tinlycore Linux LiveCD 作为基础的工具运行平台,用 C++ 调用 mencoder 等软件加上 FLTK 编写应用层面。但是正而八经只用过 Java 写过点东西。下面浏览复习一下相关的知识点。

2010年12月31日 星期五
因为用 Bash + dialog 编写程序的图形界面終始控制力不够,而且,想用面向对象的思维编写 Bash 脚本始终觉得别扭。感觉用 c++ 来写可能还要快些,而且对以后的维护有好处。另外一个考虑就是 c++ 闭源比较容易些。当然,经过可行性的试验,确实可以用面向对象的思维方式编写 Bash 脚本,而且可以用加密器(或者还可以加上脚本代码混淆器进行一定程度的闭源)。我发现在 tinycore linux 里面不能完全正常使用 easybashgui ,但是直接用 zenity 可以正常使用,但是要另外安装一大堆 GTK2 的东西,不能直接使用系统的 FLTK。如果使用 c++ 的话,我可以直接使用 FLTK 库来写图形界面。虽然,我以前没实践过,但是道理应该是相通的。编写简单的东西应该没有问题的。而且,用 c++ 加上 FLTK 编程,以后如果要把系统移植到 Windows 等平台也要容易些。

如果开源对人对己都没有好处,如果没有充分的理由开源,我写的这个手机内存卡应用工具还是保持闭源的好。我2004年~2006年的那个Java学习日记开源项目,自己就觉得设计太差,会误导刚入门学习的朋友,会误人子弟的,所以干脆就把这个项目删除了。而这次,我不能犯同样的错误,没有考虑清楚就为了开源而开源。

闭源有一个好处,不管代码有多滥,可以使人眼不见为净。我现在的目标是做出一个我心目上的手机内存卡工具来,实用为目的。当然,我的方案是基于开源平台的,不要忘记这一点。

今天使用 C++ 加上 FLTK 重写可行性试验程序
代码要简洁、优美、要给人舒服的感觉。
C++ 原来自考时的时候学习过,但没有用过,学过一段时间的Java ,考虑完成简单的东西应该问题不大。

2011年01月01日 星期六
把原来的 c 语言书翻了一下,遗忘知识点学习
1、c语言字符串指针: char * string; string="hello"; 是按字符数组处理的,必须先初始化指针变量,即把字符数组(即字符串)hello 首地址赋给 string 。
2、指向数组元素的指针变量:
int a[10];
int * p;
p=&a[0]; /*或 p=a; c语言规定数组名代表数组的首地址*/
3、形式参数和实际参数
定义函数时的参数是形式参数,调用函数时的参数是实际参数;c语言中实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能反过来由形参传给实参。

浏览c++书(面向对象程序设计/刘振安主编,ISBN 7-5058-1997-6)
1、const 修饰指针 p7
2、引用 相当于为变量取一个别名,主要可以为函数增加引用传递的方式和返回引用的函数 p10
3、类包括类说明和类体 p19
4、访问对象成员的方法:p22
1)、直接访问一个对象的成员:object.getX(),成员选择运算符 .
2)、访问一个指针所指向对象的成员:point->getX(),成员访问运算符 ->
3)、通过引用访问一个对象的成员:refobject.getX(),成员选择运算符 .
5、在类说明中定义类体的成员函数叫作内联函数 p26
6、用 new 显式建立的对象必须用 delete 显式的销毁 p42
7、建立派生类的对象时会先调用基类的构造函数,再按照类层次结构依次调用派生类的构造函数;对象销毁时调用析构函数的顺序与调用构造函数的顺序相反
8、运行时的多态要使用虚函数(virtual)来实现,如建立一个派生类的对象,赋给一个基类的指针,如不把基类的相应函数声明为虚函数,则用指针调用的函数只能是基类的函数,对象销毁时调用的析构函数也只是基类的析构函数;但 c++ 不支持虚构造函数,所以建立派生类的对象时仍然会先调用基类的构造函数,再依次调用派生类的构造函数 p90, p103
8.5、如果多态的功能强大,应予提倡,否则就应该避免 p102
9、静态成员属于类共用,通过类名访问 p107
10、question: const 和 volatile 对象的使用 p114
11、运算符重载: 在 C++ 函数内部 8+7 相当于 operator + (8,7); 重载复数加法的例子 p128
12、C++ 格式控制: p138
13、操作一致,数据结构一致,但是数据类型不一致用模板(包括函数模板和类模板)
14、确定类的原则: p156
1)、从问题归纳出需要描述的一个概念或实体,从这些概念或实体出发去建立相应的类;
2)、尽量使类小而简单;
3)、充分利用封装增加类的自身可靠性;
4)、通过继承建立类族,以便使多态有用武之地;
5)、应把最先设计出的方案仅仅作为一种原型。
15、改变思维方式 p160
1)、减少自由全程变量的信任
2)、减少使用自由过程
3)、减少类型模糊,保证类型正确
4)、用 new 和 delete 代替 malloc 和 free
16、设计类要回答的几个问题:p163
1)、应该怎样建立和删除对象?
...
17、说明类的几点建议 p164
1)、尽量使类接口既完整又最紧凑
2)、注意成员函数、全局函数、友元函数的差别
3)、在公共接口中勿用数据成员
4)、尽量多用 const
5)、通过引用而不是值来传递和返回对象
6)、在返回对象时不要试图返回引用
7)、慎重选择函数重载或参数缺省
8)、避免对指针或数值类型重载
9)、谨防潜在的两义性问题
10)、明确禁用无端隐含生成的成员函数
11)、利用结构划分全局名空间
18、更好的理解对自己的软件系统想说的一切 p165
1)、确信仅有继承就是“一个”
2)、注意接口的继承与实现的继承之间的差别
3)、千万不要重新定义继承的非虚函数
4)、千万不要重新定义继承的缺省参数值
5)、千万不要向下映射继承类属
6)、利用分层技术实现“有一个”和“按......实现“
7)、谨慎使用私有继承
8)、继承与模板的区别
9)、谨慎使用多重继承
10)、说清意思,理解内容
19、实现 is-implemented-in-terms-of 的例子: p169
两个类是平等的关系,已经写出了一个类,另一个类可以利用这个类的大部分代码,可以把这个类的一个对象作为私有数据成员,再重定义这个类中的一些函数操作这个私有数据成员。