github:​​https://github.com/jiangxincode​

首先说明一下const在C和C++中的主要使用方法。被const修饰的东西都受到强制保护,能够预防意外的变动。能提高程序的健壮性。它能够修饰变量、函数的參数、返回值,甚至函数的定义体。


const修饰变量


const修饰变量通经常使用于定义符号常量。我们过去一般使用宏定义的方式定义符号常量,比方:


#define PI3.1415926


事实上我们也能够使用const方式定义符号常量。以下的语句与上面宏定义的方式达到的效果相似。


const double PI3.1415926


那两者有什么差别呢?在使用宏定义的方式时,首先在预处理过程中将源程序中的常量名所有替换成相应的字面常量,然后对替换过的源程序进行编译。

相比較之下const方式不涉及预处理过程,它仅仅在编译project中起作用。由于宏定义方式定义的符号常量没有类型,所以不能进行严格的类型检查,而const则能够,而且有些调试工具能够对const常量进行调试。而不能对宏常量进行调试。

但这也不是说宏常量就比const常量差,比方你能够利用const常量实现以下的宏定义功能么?


#ifndefJIANGXIN_H


#defineJIANGXIN_H


#endef


并且由于历史原因。实际上使用宏常量的情况远远大于const常量,特别是在纯C编程环境中。只是在C++编程环境中。我还是推荐你使用const。由于这更加安全。同一时候时刻记住一句话。const常量作用与编译期,宏常量作用于预编译期,当你遇到一些令人迷惑的问题时想想这句话,也许可以有所收获。


如今举几个样例:


const int m = 0; //事实上我们通常把const符号常量叫做const常量,以便和宏常量区分


typedef char * pStr; //新的类型pStr。代表一个指向char的指针类型。


char string[4] = "abc";


const char *p1 = string;//p1是一个指针。指向一个const char类型


p1++; //正确。p1本身不是常量,它指向一个常量


const pStr p2 = string; //p2是一个常量指针,这个指针指向一个char类型变量


p2++; //错误,p2是一个常量指针


char *const p3 = string; //p3同p2同样,是一个常量指针


char const* p4 = string; //p4同p1同样,是一个指向const char的指针,仅仅能用于C中,在C++中仅仅能使用const char *p4 = string;


const修饰函数形參


函数形參主要包含传值型參数,传指针型參数。传引用型參数。


对于传指针和传引用型參数,假设我们怕在该函数中错误的改变实參的值。一般都会加上const来修饰形參。


对于传值型參数,我们一般不会使用const修饰,由于全然没有必要。你是不是用const。都不能改变实參的值,由于传值型形參是在栈中分配的,函数调用之后一定会销毁。比如:void Fun(int n)和void Fun(const int n)没有不论什么差别,并且还是代码更加晦涩。所以不推荐。可是有一种情况须要考虑,假设你须要传递一个比較复杂的类类型。可是你又不须要改变该类的对象,这时你能够将传值改为传指针或者引用,同一时候用const修饰。这种话就避免了构造暂时对象的开销。比方增加A是一个非常复杂的类类型,这是使用void Fun(const A &a)要比void Fun(A a)效率更高。


用const修饰函数的返回值


函数的返回值与形參类似,也包含返回值类型,返回指针类型,返回引用类型。


对于返回值类型为指针或者引用的情况,假设我们不希望其被改动,能够使用const对返回值进行限定。此时该返回值const修饰的同类型const指针(返回值为指针)或者同类型的const变量(返回值为引用,且该值为基本类型或者定义了拷贝构造函数、拷贝赋值运算符的类型)。如对于:


const char * Fun(void);


例如以下语句将出现编译错误:


char *str = Fun();//cannotconvert from 'const char *' to 'char *';


正确的使用方法是:


const char *str= Fun();


假设返回值类型为值类型。因为函数会把返回值拷贝到外部函数的存储单元中,加const修饰没有不论什么价值。所以不要把函数int Fun(void) 写成const int Fun(void)。

可是在某些情况下将值类型改为引用类型或者指针类型能够提高效率。可用不用const就看你要不要改变它们了。


const修饰成员函数


constkeyword能够放在函数声明的尾部,表示该类成员不改动对象。

注意const仅仅能修饰类的成员函数,不能修饰普通函数。不管是C还是C++。