ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:48.92KB ,
资源ID:6101453      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6101453.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(0常量Word格式.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

0常量Word格式.docx

1、 INTI_RECT_VALUE( rectindex.a, rectindex.b ); 0-3:使用宏时,不允许参数发生变化。如下用法可能导致错误。#define SQUARE( a ) (a) * (a)int a = 5;int b;b = SQUARE( a+ ); / 结果:a = 7,即执行了两次增1。正确的用法是:b = SQUARE( a );a+;a = 6,即只执行了一次增1。 0-4:在C+程序中尽量以const和inline取代#define。换言之,尽量以编译器(compiler)取代预编译器(preprocessor)。C+ 语言可以用const 来定义常量,也可

2、以用 #define 来定义常量。但是前者比后者有更多的优点:(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。#define DEFAULT_WIDTH 320;/ DEFAULT_WIDTH没有进入符号表const LONG DEFAULT_WIDTH = 320;/ DEFAULT_WIDTH进入符号表(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。inline函数可以获得宏带来的高效率以及函数带来的可预期行为和参数

3、类型检验。可以通过下面的例子来说明。下面是这个程序的输出,它完全不是我们想从真正的函数期望得到的结果:但是如果将上面那条宏该为inline int band(int x) return (x)5) & (x)10 ? (x) : 0;就可以得到预期的结果。如果不需要参数检查,可以使用template修正这一问题,做到尽善尽美:template inline const T& band(const T&x) return (x)上面写法使用了引用传递(返回值与参数),提高了函数的效率。 0-5: const 更大的魅力是它可以修饰指针、数组、变量、函数的参数、函数返回值,甚至函数的定义体,推荐尽

4、量使用const。(1)可以使指针成为const指针,如果程序员以后想在程序代码中改变这种指针的使用,编译器将给出通知,这大大增加了安全性。当使用带有指针的const时,有两种选择:或者const修饰指针正指向对象,或者const修饰存储在指针本身的地址里。两者区分的原则是“最靠近”原则。 char *p = “Hello”;/non-const pointer,non-const dataconst char *p = “Hello”;/non-const pointer,const data, 指向const的指针, 这里可以不需要初始化,因为说p可以指向任何东西(那是说,它不是一个con

5、st),但它所指的东西是不能被改变的。char const *p = “Hello”;/non-const pointer,const data,不推荐这种写法。 char * const p = “Hello”;/const pointer,non-const data, p是一个指针,这个指针是指向char的const指针。 const char * const p = “Hello”;/const pointer,const data。(1-1)const char *p = “Hello”;const char *q = “Hello”;*p = *q;/不合法(1-2)char *

6、const p = “Hello”;p = q;(2)用const 修饰函数的参数。如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。virtual HRESULT ExecuteAddXpdr(/*in*/const XPDRTERSTRUCT *const pXpdrParams); ST_ErrorCode_t STBLIT_Init(const ST_DeviceName_t DeviceName, const STBLIT_InitParams_t * const InitParams_p);如果函数体内的语句试图改动pXpdrParams的

7、内容或者pXpdrParams本身地址,编译器将指出错误。下面是函数重载的写法,对XpdrNoInRegion采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰,下面有些const修辞是多余的。virtual HRESULT ExecuteModifyXpdr(/*in*/const INT XpdrNoInRegion, /*in*/const XPDRTERSTRUCT *const pXpdrParams); /*in*/const INT XpdrFreq, /*in*/const BYTE BandMode); /*in*/

8、const INT FreqOffset, /*in*/const BYTE BandMode);virtual HRESULT ExecuteDeleteXpdr(/*in*/const INT XpdrNoInRegion);(3)对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个

9、缺点:“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。(4)用const 修饰函数的返回值。(4-A)如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();(4-B)如果函数返回值采用“值传递方

10、式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。例如不要把函数int GetInt(void) 写成const int GetInt(void)。同理不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。(4-C)函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在

11、类的赋值函数中,目的是为了实现链式表达。例如:class A.A & operate = (const A &other); / 赋值函数;A a, b, c; / a, b, c 为A 的对象a = b = c; / 正常的链式赋值(a = b) = c; / 不正常的链式赋值,但合法如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。(4-D)任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const

12、成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。编译器将指出GetCount 函数中的错误。class Stackpublic:void Push(int elem);int Pop(void);int GetCount(void) const; / const 成员函数private:int m_num;int m_data100;int Stack:GetCount(void) const+ m_num; / 编译错误,企图修改数据成员m_numPop(); / 编译

13、错误,企图调用非const 函数return m_num;const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。(5)const还可以用来修辞一维或多维常量数组。下面HfilterBuffer和gridheader数组的数据就不能在更改了。const U8 HFilterBufferSTBLIT_HFILTER_COEFFICIENTS_SIZE * STBLIT_DEFAULT_NUMBER_FILTERS =/* Filter 921 */ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x

14、00, 0x00, 0x00, 0xff, 0x07, 0x3d, 0xfc, 0x01, 0x00,/* Filter 1024 */ 0xff, 0x03, 0xfd, 0x08, 0x3e, 0xf9, 0x04, 0xfe,extern const U8 HFilterBufferSTBLIT_HFILTER_COEFFICIENTS_SIZE * STBLIT_DEFAULT_NUMBER_FILTERS;/fill grid header information static const UINT gridheader = IDD_STR_ALLSEL, ID_INDICATOR_

15、CARD_CARDID, ID_INDICATOR_CARD_CARDLEVEL, ID_INDICATOR_CARD_ISSUSPENDED, ID_INDICATOR_CARD_ISSALE, ID_INDICATOR_USER_USRNAME, ID_INDICATOR_USER_USRID, ID_INDICATOR_CARD_SALEDATETIME, ID_INDICATOR_CARD_STOREDATETIME, ID_INDICATOR_CARD_STOPDATETIME, ID_INDICATOR_CARD_USRMSG,(6)通过上面的分析,就不难理解下面几个例子了。sta

16、tic const ST_Revision_t Revision399 = STV0399-LLA_REL_2.1.0 ;static void Copy1DNoOverlapMPEG1DBlockMove(void * const SrcAddr_p, void * const DestAddr_p, const U32 Size);error = STTUNER_Open(TunerDeviceNameParams_p-Tuner, (const STTUNER_OpenParams_t *)&OpenParams, &TUNERHandle); 0-6:明智地运用inline。inlin

17、e函数,看起来像函数,动作起来像函数,比宏好得多,而且可以调用它们,不需要蒙受函数调用所带来的额外负担。由于每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。(2)如果函数体内出现多个循环,那么执行函数体内代码的时间要比函数调用的开销大。下面函数init_programs和find_program函数比较简单,而且没有多个循环,推荐用内联函数的写法。inline 是一种“用于实现的关键字”,必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

18、定义在类声明之中的成员函数将自动地成为内联函数,因此这种情况可以省略书写inline。struct CPrograms PROGRAM_INFO* m_programsMAX_PROGRAM_NUMBER; int m_ProgramCount; _inline void init_programs(void) m_ProgramCount = 0; _inline BOOL find_program(const DWORD dwProgramNumber, int *pIndex) for (int i = 0; iprogram_number = dwProgramNumber) *pIn

19、dex = i; return TRUE; return FALSE; 0-7: 如何使得某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const 修饰数据成员来实现。但是应该注意const 数据成员的初始化只能在类构造函数的初始化表中进行。如下例子不符合规范。因为类的对象未被创建时,编译器不知道SIZE 的值是什么。const int SIZE = 100; / 错误,企图在类声明中初始化const 数据成员int arraySIZE; / 错误,未知的SIZE应如下书写:.A(int size); / 构造函数const int SIZE ;A:A(int size) : SIZE(size) / 构造函数的初始化表A a(100);A b(200);

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2