您的位置:首页 > 编程语言 > C语言/C++

浅谈C与C++的设计与编程风格(一)

2010-01-27 21:23 323 查看
一直想写一些比较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(...);
//调用的代码
CheckState(...)->DoSomething(...);
(PS:以上代码除了最后一句调用外,其它都是在头文件中,这也解释了为什么C++程序员更重视头文件而不是源代码)比较一下可以看出,调用部分的C++代码比C代码精简了许多(而且效率上也可能更高)!在这个例子中可能您会说,C++代码还增加了大量的头文件中的代码,用以描述各个类之间的关系!的确是这样,这正是C++风格的特点:试图将一个逻辑复杂的控制流映射为一组对象间的关系以及数据流。在一些更加复杂的情况中,这个机制能够发挥出强大的威力(因为数据流比控制流更容易把握)!
(未完待续……)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 c c++ struct 语言 任务