浅谈C与C++的设计与编程风格(一)
一直想写一些比较C和C++设计与编程风格的文字,正好近来工作任务不多,能够有时间重新整理一下自己所学的东东,于是便决定开始写这个题目,而目的仅仅只是打算能就这个话题和大家讨论讨论,抛砖引玉、增长个人的见识。
首先想说明一下,个人是C++设计、编程风格的坚定拥护者,所以我的观点难免带有个人的偏好,如果您不赞同,也请批评指正。好了,言归正传,个人觉得C与C++设计与编程风格最本质的不同是:C以函数间的调用关系为核心(所以C语言被称为面向过程式语言),而C++以程序元素(对象)间的关系和结构为核心(所以C++被称为面向对象的语言)——PS:如果您拿到一堆代码后首先去看各个函数的实现,并试图弄懂它们是如何相互调用的,那证明您是一位典型的C程序员;而如果您首先是去查看所有头文件,并试图搞懂每个类之间的关系,那证明您是一位典型的C++程序员。
举个简单的例子,对于一名C程序员,当他需要实现某种状态机时,通常是使用下面这样的代码:
if (0 == CheckState(...) ) // 判断某个函数的返回值是否为0
DoSomething(...); // 调用某个函数
else
DoSomethingElse(...); // 调用处理其它情况的另一个函数
或是这样:
switch( CheckState(...) ) // 根据某个函数的返回值做不同的动作
{
case 0:
DoSomething1(...);
break;
case 1:
DoSomething2(...);
break;
case -1:
DoSomething3(...);
break;
default:
DoSomethingElse(...);
}
(PS:以上这些代码必然是在源文件的某个函数中出现的,这也解释了为什么C程序员总是先看源文件。)而一个C++程序员则可能不这么做,这里C++程序员多了一种选择——使用虚函数:
//申明一个接口
struct IStateMachine
{
virtual void DoSomething(...) = 0;
};
// 针对状态0提供一个实现类
struct CDoSomethingForState0: IStateMachine
{
virtual void DoSomething(...);
}
// 针对状态1提供一个实现类
struct CDoSomethingForState1: IStateMachine
{
virtual void DoSomething(...);
};
// 针对其它状态提供一个实现类
struct CDoSomethingForOhterStates: IStateMachine
{
virtual void DoSomething(...);
};
// 使用一个工厂函数来返回特定的实现对象
IStateMachine * CheckState(...);
//
相关文档:
关于c的动态内存管理一直是个经久不衰的话题,面试也是基本上都会考的,本来感觉已经明白了,但是今天使用的时候一不小心导致程序崩溃了,因此深入的去查了下资料,收获不少...贴出来与大家分享...
先贴个错误代码:
int * ptr = (int *)mal ......
偶然的因素,对const来了点兴趣,做了一下实验:
1. 语法:const、指针
在gcc中, 对于C语言,下面的语句是合法的:
const int a=0;
int *p=&a;
而C++中,需要手工强制转换才能编译通过:
......
当读者有一定c/c++基础
推荐的阅读顺序:
level 1
从<<essential c++>>开始,短小精悍,可以对c++能进一步了解其特性
以<<c++ primer>>作字典和课外读物,因为太厚不可能一口气看完
level 2
然后从<<effective c++>>开始转职,这是圣经,请遵守10诫,要经常看,没事就拿来翻翻
......
高质量C++编程 Note
定义1:能长期稳定地编写出高质量程序的程序员称为编程老手。
定义2:能长期稳定地编写出高难度、高质量程序的程序员称为编程高手。
版权和版本的声明位于头文件和定义文件的开头 ,主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
......