const与define
const的运用笔记
参考书籍:
effective c++ 第三版、c++ Primer Plus;
尽量使用const、enum、inline替换define;
为什么不提倡使用define?
相信大家和我一样,刚刚认识define的时候觉得这个真的是个偷懒的好东西。有时只要只要包含一个define,就可以少输入很多复杂的数字、字符串等等。但是为什么不提倡使用define呢?
因为#define不被是为语言的一部分,例如
#define a 1.653
①记号名称 a 可能未被编译器看见
②也许在编译开始处理源码前,他就被预处理器移走了
于是乎记号名称a可能没有进入记号表内,当你运用常量获得一个编译错误信息时,有可能会带来困惑,因为这个错误信息可能是1.653而不是a;若这个a被定义在一个非你所写的头文件中,你会对1.653毫无头绪。
另外,使用#define是见到那的替换,可能会产生多个1.653。
解决方法用一个常量替换宏。
const double a=1.653; //书写习惯,大写一般用于宏,这里用小写区分。
这样就可以被编译器看见,也会进入记号表内。同时也不会产生多个1.653。
const的使用
1.const修饰普通变量
const修饰后,变量变为常量变量,顾名思义不可修改变量。
常用于第一数组
const int n=5;
int a[n];
用于修饰形参,传入的数值不可以被改变
void fun(const char& ch){
//........
}
用于类成员变量的初始化;
一般来说,类的定义中成员只可声明不可初始化。初始化一般在类的实现中的构造函数中实现。
但是被const修饰的成员例外。
还可用于修饰函数的返回值,使其返回一个常量变量。
class Myclass
{
private: const int a=10;
};
2.修饰指针
这里要记得,十分容易记混的就是const修饰指针时,一种是使得指针指向不可改变,一种是使得指针指向的内容,内容不可改变。
int a=5;
const *int p1=&a; //const在*前面,修饰int ,指针的指向的内容不可改变;
const int *p2=&a; //与第一个是一样的;
int *const p3=&a; //const在*后面,修饰int* ,指针的指向不可改变;
const int * const p4=&a;
3 const修饰函数;
在类中往往会有一些函数是作为输出函数,或者接口函数。我们不希望它改变成员变量。
所以往往会使用const去修饰,使得函数从修改函数变成不可修改函数。
class Myclass
{
private: int a;
public:
void Out() const;
{
cout<<a<<endl;
}
这是一种保险措施,防止在函数中不小心修改了不想修改的值,把这个检查的认为交给了编译器。
注意
①对于单纯常量,最好用const 对象或者enum替换#define
②对于形式函数的宏,最好用inline(内联)函数替换#define。
当然#define在实际运用中还是不可缺少的。
例如,当我们自定义一个头文件时,往往会使用下面的方法,为了防止重复定义头文件中的内容造成错误。
#ifndef MYHEADER_H //头文件名称大写,myheader.h
#define MYHEADER_H
//中间为头文件的内容,例如类的定义等等
#endif
这里教会我,人总是会犯错的,把这些检查容易被忽略的错误交给编译器去处理是一种优雅的做法
比如常常有人写判断语句时把比较符“==”写成了赋值符“=”。此时只要改变我们的输入习惯常量放在左边就可以将这个检查任务交给编译器,例如
if(1==a)
{
//......
}
当达成1=a时就会报错,因为常量不可作为左值。
下一篇: jQuery.extend()方法