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

2014-11-24 12:34:45 · 作者: · 浏览: 3

我已经学完了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

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

{

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

}

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


摘自 Cql_liliang‘s Blog