浅谈C与C++的设计与编程风格(二)
上次总结了C++(面向对象)设计的核心思想,并且例举了使用类模型来替代if和switch的一种较为典型的情况。下面想来谈谈C++在编码方面的特点。
在很多经典的C++教程中都有一个建议:应尽量使用户代码(库的使用者)看起来短小而简单。按照常识,简单的代码通常要比大段的代码好理解,而用户代码通常实现的是最上层的功能或者界面,它的不确定性更大,经验告诉我们,最容易出错的代码正是那些被频繁修改的代码!因此简单的用户代码是有好处的,在开发一个库时我们应尽量遵守这个建议。
C++有两个机制可以帮助我们实现这一点,一个是运算符重载,另一个就是模板。
C++的运算符重载机制非常强大,这里就举一个简单的例子。C语言中有一种对数组的特殊初始化方式,比如:int a[4] = {1,4,2,3}; 这样的语法非常清晰且容易让人理解,然而很可惜的是,这样的语法不能用于对数组的赋值,对数组的赋值必须使用一个循环操作,当这个数组中的内容不是按顺序排列时,对数组的赋值很可能会演变成一个非常复杂的过程。
但是在C++中,我们却可以利用重载运算符来实现一种相似的赋值语法,方法就是我们设计一个迭代器,并重载该迭代器的 , 运算符,然后再设计一个可以使用这个迭代器的数组类,并重载这个数组的=运算符,它们的代码大致会是这样:
// 一个重载了,运算符的迭代器类
class CCopyIterator
{
int * m_piItem;
public:
CCopyIterator(int in_aiItems[])
{
m_piItem = in_aiItems;
};
CCopyIterator & operator ,(int in_iVal)
{
*(m_piItem++) = in_iVal;
return *this;
}
};
//可以使用CCopyIterator赋值的数组
class CSmartArray
{
int m_aiItems[100]; // 这里使用一个定长的数组是为了回避回收内存空间的问题,毕竟这不是我们要讨论的主要问题
public:
CCopyIterator operator =(int in_iFirstVal)
{
CopyIterator rtn(m_aiItems);
return (rtn, in_iFirstVal);
}
相关文档:
Boss说,要看OpenGL,看了快一个月,总算出了个像样的东西,用C写了个3D迷宫,
虽然只有350行
代码,不过边学边写,足足写了一周时间,还是小有成就感的,活活活!
&n ......
定义一个字符指针,其本质的处理方式是按字符数组处理的,在内存开辟一个字符数组用来存放字符串常量,这样必定会终止符。而这样的特性也仅对于字符指针变量。
在C语言中,通过数组名或者指针变量输出一个字符串,我理解为两个:字符串终止符的存在;以%s格式的输出方式。
char *p="I love china!";
& ......
1.
引言
C++
语言的创建初衷是“a
better C”
,但是这并不意味着C++
中类似C
语言的全局变量和函数所采用的编译和连接方式与C
语言完全相同。作为一种欲与C
兼容的语言,C++
保留了一部分过程 式语言的特点(被世人称为“
不彻底地面向对象”
),因而它可以定义不属于任何类的全局 ......
#include "mex.h"
#define DWORD long
#define NUMBER_OF_STRUCTS (sizeof(friends)/sizeof(struct phonebook))
#define NUMBER_OF_FIELDS (sizeof(field_names)/sizeof(*field_names))
void mexFunction(int nlhs,
mxArray * plhs[] , int nrhs,const mxArray * pahs[])
{
typedef struc ......