十分钟学会const


前言

在程序中,有一句建议“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++》

猜你喜欢

转载自blog.csdn.net/m0_73299809/article/details/128737735