为什么经常用const来代替宏
常量:是一种标识符,值在运行期间不变。
C语言用#define,C++也可以用,它还可以用const来表示常量。
常量可以使程序的可读性变强,想一下如程序中全是变量字符串,会不会很麻烦呢?我们写程序会相当复杂。
宏和const具体就不介绍怎么使用了。注意的是,宏后面没有分号,const有的。
const和宏的比较:
1.const是有类型的,而宏是没有的。它等于是给某个数字或者字符串用特定的名字来表示,就是起一个别名,这样会很方便。
2.在编译器进行编译的时候,宏是直接替换的,并不会检查错误,这个时候如果出现错误就不好排查了。并且宏没有类型安全检查。
3.有些集成化的而工具可以对常量进行调试,宏不可以调试。
4.在C++中尽量不使用宏,而是用const代替。
注意:再类中不能初始化const数据成员,只能在构造函数的初始化列表中初始化
要建立一个在整个类中都恒定的常量?用枚举实现。枚举不会占用对象的存储空间,在编译时被全部求值,缺点就是它不可以表示浮点,而且只能表示整数,最大值有限
使用const提高函数的健壮性
const最大的用途就是作为函数的参数,返回值,或者是函数的定义体。
- 用const修饰的函数的参数,如果参数作为输出用,不管是什么类型的参数都不能不能加const修饰,否则该参数将会失去输出功能。
- Const只能修饰输入参数:传递指针,可以防止意外的改动该指针,起到保护作用。
- 如果是值传递的话,就不要加const了,因为,值传递本来就需要进行参数的复制,加了const就出现错误了。
- 如果是非类型的参数的话,比如说是一个string类,传值就会很浪费空间,因为还要拷贝,所以传引用会更加的有效率,引用只是变量的别名,不会有拷贝,提高效率,所以一般情况下,非类型的的参数都是传引用。如果是内置类型的话,就没有必要了。
Const修饰函数的返回值
- 返回值修饰指针:const char *GetString(); 表示该函数返回值的内容(指针指向的内容不可以改变,不能被修改)该返回值只能赋值给加const修饰的同类型的指针
- 返回值就是内置类型:一般不用const修饰,我们都知道,函数的返回值,在最后返回的时候都会进行临时对象的拷贝,是用一个临时对象保存着的。所以就不要加const了
- 返回值是类类型:此时需要搞清楚,这个函数是想返回什么,它是想返回一个对象的拷贝,还是仅仅返回“别名”。如果这个返回值在函数退出后还存在,那么就返回引用,如果不存在,就不加引用。
- 函数返回值采用“引用传递”的场景并不是很多,例如类中的赋值运算符的重载,采用引用返回值,就是为了实现链式表达,就是实现连续赋值的功能。
const成员函数:
任何不会修改数据成员的函数都应该定义为const类型的,就是为了防止修改。定义为const的话,如果不小心修改了,编译器也会报错,这就提高了程序的健壮性,防止出错。
注意:const成员函数的声明只能放在函数声明的尾部。
函数内联(inline):
提高函数的运行效率,C语言用宏来提高执行效率,但是宏也有很多的缺点,所以C++中又引入内联,吧函数定义为内联,可以减少压栈,内联函数没有调用栈桢的开销,
注意:并不是所有的函数都支持内联,(即使定义了内联,也不一定就是没有调用栈桢)要求函数内部必须比较简单,没有复杂的结构,例如递归,复杂的 循环体。Inline必须与函数定义体放在一起。类中的成员函数默认为inline
但是并不是所有的函数都用为内联就比较好了,因为内联会复制代码,如果所有的函数都用内联,那代码量就会非常的多,这就会很浪费资源了。
很多情况下不宜是用内联,因为总代码量会变得很多,消耗空间。
例如:
代码较长,循环,递归,等。