浅谈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(...);
//
相关文档:
Boss说,要看OpenGL,看了快一个月,总算出了个像样的东西,用C写了个3D迷宫,
虽然只有350行
代码,不过边学边写,足足写了一周时间,还是小有成就感的,活活活!
&n ......
http://blog.csdn.net/utopia2006/archive/2008/05/30/2495667.aspx
目的:当程序在前台运行时,按挂机键程序不退出,只是退到后台运行,程序在后台运行时,按c键能把程序结束
方法:在HandleWsEventL()中屏蔽挂机键KAknUidValueEndKeyCloseEvent,在值在avkon.hrh中定义,实践中发现8.0sdk的avkon.hrh没有定义KAknUidValu ......
目的:当程序在前台运行时,按挂机键程序不退出,只是退到后台运行,程序在后台运行时,按c键能把程序结束
方法:在HandleWsEventL()中屏蔽挂机键KAknUidValueEndKeyCloseEvent,在值在avkon.hrh中定义,实践中发现8.0sdk的avkon.hrh没有定义KAknUidValueEndKeyCloseEvent,唯有手工添加定义#define KAknUidValueEndK ......
1、C/C++程序员请注意,不能在case语句不为空时“向下执行”。
2、值类型和引用类型之间的区别:C#的基本类型(int,char等)都是值类型,是在栈中创建的。而对象是引用类型,创建于堆中,需要使用关键字new。
3、在C#中通过实例访问静态方法或成员变量是不合法的,会生成编译器错误。但是我们可以通过声明他们 ......