在C语言中我们经常使用#define来定义常量
#define pi 3.14;
C++提供了一种更灵活、更安全的方式来定义常量,即使用const修饰符来定义常量。
const float pi = 3.14;
这个常量pi是类型化的,它有地址,可以用指针指向它,但不能修改它。const与#define相似,但它消除了#define的不安全性,因此C++建议用const取代#define定义常量。
const可以与指针一起用,有三种情况,如下:
1、指向常量的指针:一个指向常量的指针变量。
const char * pc = "abcd";
这个语句的含义是:声明一个名为pc的指针变量,它指向一个字符型常量,初始化pc为指向字符串“abcd”.
不允许改变指针所指的变量,但可以改变所指的地址。
如:pc[3]='x'; 是错误的;
pc="efgh"; 是正确的,可以改变地址。
2、常指针:把指针变量所指的地址,而不是它所指的对象声明为常量。
char * const pc = "abcd";
这个语句的含义是声明一个名为pc的指针变量,该指针是指向字符型数据的常指针,用字符串abcd来初始化该常指针。
创建一个常指针,就是创建一个不能移动的固定指针即不能改变指针所指的地址,但是它所指的地址中的数据可以改变。如:
pc[3]= 'x';是正确的
pc="efgh";是错误的,地址为常量,不能进行改变。
3、指向常量的常指针:这个指针变量所指的地址不能改变,它所指向的地址中的数据也不能改变,要声明一个指向常量的常指针,二者都要声明为const.
const char * const pc = ""abcd;
例如:pc[3]=''x; 错误
pc= "efgh"; 错误;
函数的参数也可以用const说明,用于保证实参在该函数内部不被改动,大多数c++编辑器能对具有const参数的函数进行更好的代码优化。
int i_max(const int * ptr);
这样做的目的是确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读不许写。
某些时候const变量的初始值不是一个常量表达式,但又确实有必要在文件间共享。在这种情况下,我们想只在一个文件中定义const,而在其他多个文件中声明并使用它。解决的办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需定义就可以了。
如:
// file_1.cc 定义并初始化了一个常量,该常量能被其他其他文件访问
extern const int bufsize = fcn();
//file_1.h头文件
extern const int bufsize;//与file_1.cc的bufsize是同一个。
在函数中使用常量函数和常量引用是避免直接对实参的拷贝。