Const与函数
收集了一些const的基础性的东西,估计其他的用法也都是这些基础的知识的延伸。
1.const基础
(1)const初始化
对于const变量需要在定义时就初始化。类的成员变量被定义为const变量,则要在构造函数中用参数列表的方式初始化。
(2)const指针
如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:
Intb = 500;
const int* p = &b; //常量数据
int const *p = &b; //常量数据
int* const p = &b; //常量指针
const int* const p = &b; //常量数据,常量指针
可以根据const关键字跟谁靠得更近来记忆。如果const跟指针变量靠得更近(例如:int* const p = &b;),则是常量指针,该指针的指向不能够改变;如果跟星号(*)靠得跟进(例如:const int* p = &b; 和int const *p = &b; ),则是该指针指向的变量是常数的,不可改变。
2.const与函数
2.1const修饰函数参数与返回值
其实无论是修饰函数参数还是函数返回值,道理是一样,都是表示为常量的不能够修改的。
(1)const修饰函数参数
TYPE fun(constTYPE a){ }调用函数的时候,被const修饰的参数初始化为const常量,在函数体内,按照const变量的原则处理这些修饰的const参数。例如const TYPE *p,则不能对指针变量p指向的对象进行改变,保护了原指针所指向的内容。
(2)cosnt修饰函数返回值
const修饰函数返回值要分为两种不同情况。一是如果修饰的返回指针,即指针传递;二是修饰的返回的普通的局部变量,即值传递。
如果const修饰的是函数返回的指针变量,例如:
const int* getScore(void)
那么函数返回的指针所指向的内容是不能够被修改的,并且该返回值只能被赋值给const类型的同类型的指针。例如int p1= getScore(void);是错误,正确的做法是const intp1= getScore(void);
如果const修饰的值传递的函数,例如:
const int getScore(void)
由于函数的返回值会在主调函数中另外的空间存放,这样的加上const是没有任何价值。
2.2const修函类的成员函数
任何不会修改类的成员变量的成员函数都应该声明为const类型。这样可以提高程序的健壮性(任何错误的修改成员变量的操作,编译器都会提醒错误在哪里)。
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员,对于类的静态数据成员,静态成员函数则可以修改)作任何改变。
const修饰的类的成员函数 表示的是不能对类的成员变量做修改,不同于前面所提的const修饰函数参数和修饰函数返回值,所以const的类成员函数的声明方式是将const放在函数函数表的后面,而不是在函数的前面或者参数表内,例如:int fun(void) const。
类的const成员函数还有一个非常显著的特征是const常量对象可以调用const成员函数,而非const成员函数侧不能被调用。所以只要是不会修改成员变量的函数最好都要声明为const函数。