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.(符合我们的正常思维)。
补充:软件开发 , C++ ,