当前位置:编程学习 > C/C++ >>

Effective C++笔记之一:const 、enum、inline 代替#define的小结

 

我已经学完了C++了, 但是这学期好像没有学到什么东西,觉得C++我还没有入门,我想通过记笔记的形式再来学习C++,其中会有我个人对于C++的想法和不懂的地方我都会写在这里(希望高手能帮我解决不懂的地方和指出我错误的地方,谢谢),今天写第一篇,我应该每天都会写一篇的。

 

一:const、enum 、inline 的用法总结:

 

在用于替换不带参数的#define 是请用const 和enum 不仅是因为比#define 的安全性要高(会进行类型检查),而#define 定义的宏没有参数类型,只是简单的替换,而且const可用于任何的作用域的对象、函数参数、函数的返回值类型、成员函数体(可以达到防止用户修改的目的).如果在有参数的时候请用inline 代替带参数的宏(可以避免歧义,和一些错误).  对于const 修饰的变量可用一句话来表示"近水楼台先得月(变量的数据类型不看)"

有趣的是既然你上面这么说的,好我就这样做

eg0:

const char* str = "Name" ;     //把char不看说明const修饰的是*str(指向常量的指针也就是说*str的内容不能变,但是它的地址可以变

str[0] = 'F'                                      //false

str = "Fame"                                 //true

而:

char* const str = "Name"    //把char不看说明const修饰的是str(常指针),内容可以变,但是地址不能变

char* const str = "Name" ;  //常指针

str[0] = 'F' ;                         //没有语法错误完全通过但是会出现数据冲突

                                           // Unhandled exception at 0x00d914d8 in Test.exe: 0xC0000005: Access violation writing  location 0x00d97838.这是由于什么引起的???

 

但是我用new 来给str分配5个空间再逐个赋值却没有问题,这是怎么回事???

char * const str = new char[5] ;

str[0] = 'F' ;

str[1] = 'a' ;

str[2] = 'm' ;

str[3] = 'e' ;

str[4] = '\0' ;

这时候str输出为: Fame(知道原因的请告诉我,谢谢)

用const比#define 要好

eg1:

#define MAX 5               //可用下面

const int cmax = 5 ;       //替换(编译器在编译时会进行类型检查)

 

若在class的申明内,而不能在声明内定义类型的初始值,但是却要确定数组的大小时,可用enum 或static const 来代替#define .

 eg2:

class CGamePlayers

{     

private:      

     enum { NumTurns = 5} ;             

     int m_Scores[NumTurns] ;

 };

或者

class CGamePlayers

{    

   private:   

          static const int NumTurns = 5 ;        //声明变量NumTurns,注意static 不能少,因为static 申明的变量在编译的

                                                                   // 时候就确定其大小,不然的话下面的这句就会出错             

          int m_Scores[NumTurns] ;

} ;

const int CGamePlayers::NumTurns  ;       //不能在定义其大小,因为NumTurn的大小为5不能变了。

 

 用inline代替带参数的宏,效率也很高

 eg3:

#define CALL_WITH_MAX(lhs , rhs)        Fn((lhs) > (rhs) ? (lhs) : (rhs))                 //假设函数Fn已定义, 记得带上"()"

int lhs = 5 , rhs = 0 ;

CALL_WITH_MAX(++lhs , rhs) ;          //a被累加两次输出lhs = 7

CALL_WITH_MAX(++lhs , rhs+10) ;    //a被累加一次输出lhs = 6

不信你去试一下!!为什么当第一个参数大于第二个参数的时候lhs会自增两次,反之lhs却自增一次,我没有明白(我以为在lhs > rhs 的时候他会调用Fn 函数两次,其实两个语句都是调用一次,但是为什么lhs的自增次数会受到rhs大小的影响我没有弄懂(知道的多谢指教)

若用inline却不存在这样有歧义的语句

template<typename T>

inline void Call_With_Max(const T& lhs , const T& rhs)

      Fn(lhs > rhs ? lhs : rhs) ;    //假设Fn函数已定义

}

再调用函数的那边lhs的值两次都是6.(符合我们的正常思维)。   

 


摘自 Cql_liliang‘s Blog
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,