文章目录
前言
在程序中,有一句建议“Use const whenever you need”。
看到const,程序员首先想到的可能是const修饰常量。如果只知道const常量,那就只接触到const的冰山一角。
“const”全称是“constant”,在英文中是永恒不变的意思,它最大的魅力在于修饰函数的参数,返回值,甚至函数定义体。保护修饰内容不被修改,提升程序的健壮性。
一、const修饰基本类型
1.const修饰常量和数组
在定义一个变量或者数组后,避免不了对数据的使用,数据也经常在这时候被意外修改。所以,在数据不需要改动时,const修饰变量或数组,使它的值永恒不变。
对于内部类型 const 在类型前和后,二者完全一致,表示数据不可修改。
如果我们将 数值3赋给a,那么就会编译不通过。
注意:
- const修饰变量,在定义时必须初始化
2.const 修饰指针
在这里,有一个小技巧,const默认修饰左边,左边无,则修饰右边。
比如,int *const p=&a;
- const的左边是int* 表示指针,所以就是指针不可改变。
const int *p=&a
- const的左边为空,改成修饰右边int*,所以指针不可改变。
注意:
指针不可改变时,在定义时必须初始化。
二、const修饰函数
对变量的修饰仅仅是开胃菜,const最大的魅力就在于对函数的修饰,在于其修饰函数的参数、函数返回值、成员函数。
1.const修饰函数参数
const只修饰输入参数,不修饰输出参数。
- 如果输入参数是“址” 传递 ,指针型参数,用const修饰,避免意外改动,起保护作用
例如
常见的字符串拷贝函数,参数1是目的地,是输出参数,参数2是来源,是输入参数。
const修饰 Source,如果试图修改Source的值,编译将不通过。
- 如果输入参数是“值”传递,函数会自动拷贝一份参数的临时值,就不需要加const
对于“值”传递,在传递时,函数会进行拷贝,拷贝值的修改不会影响到输入值,所以不要在值传递参数前加上const。
- 对于自定义成员,const+引用
例如:
在传值时,a会进行拷贝构造,浪费空间和时间,所以一般传引用;
但是在传引用时,容易导致a的内容被修改,所以在引用前加上const,保护a的值不被修改
2.const修饰函数返回值
- 对于传“值”返回,不要用const
传“值”也会生成一个拷贝数据,在不加const时,数据就是只读不可修改,const加上后不起作用。
所以不要将 int Fun() 写成 const int Fun()
- 对于传“址”返回
对于返回const指针而言,指针不可修改,指针指向的内容也不可修改,并且我们想接收这个返回值,要用const修饰的指针。
- 对于传引用返回
在自定义类型 传引用返回,可以减少临时拷贝,节省空间,但是传引用返回时,要注意引用的对象出了作用域是否被销毁
如: const & A Fun() A为自定义类型,要检查返回的对象是否被销毁
一般而言,传引用返回比较少见,大多在类的赋值。
3.const成员函数
任何不会修改成员数据的函数都应该声明为const类型。
void Fun ( const A & a), 其中A为自定义类型,参数中隐含this指针, 如果将成员函数定义成const类型,如void Fun(const A & a) const 那么const 将修饰this指针。定义为const类型的函数,可以保证这个成员函数不修改成员数据,有意思的是,当成员数据是指针时,指针指向的内容仍然有可能被修改。
注意:
- const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象所有成员数据
- 非const成员函数不可以访问const对象。
三、const的优越性
1).定义变量
const与宏相关,但其胜于宏定义,const可以明确数据类型,编译器在预处理,会对类型进行检查,宏只是简单替换。
2).const节省空间
在自定义类型中,通常会发生拷贝构造,const+引用,减少拷贝构造,节省空间
3).防止意外修改数据
4).提高效率
编译器通常不对const常量分配空间,没有存储和读取内存的操作,提高了效率。
四、良好的编程习惯
const的使用
函数参数
函数返回值
内部类型
void Fun(int x)
不要写成void Fun(const int & x)
传值不要const,传&谨慎用const
自定义类型
尽量写成void Fun(const A & a)
谨慎使用引用,注意对象被销毁 A Fun(void) 写成 const A & Fun(void)要当心
- 对于不修改成员数据的成员函数都应该写成const类型,方便阅读
- 对于替换常量,尽量用const代替宏
参考文献
《高质量C/C++》