const函数和inline内联

 const并不陌生了 https://blog.****.net/hanani_jia/article/details/80552219

之前就对const有了一个简单的总结,不过都是用来修饰成员变量的,今天,我们要写的是关于成员函数的。

  首先介绍的是这个const最特殊的一点,就是他是写在哪的,在他修饰变量的时候,是在写某个变量的前边,但是在修饰函数的时候却写在函数的后边,看起来很怪。

 const函数和inline内联

这是我编写的一个简单的测试类

 const函数和inline内联

大家发现在编译的时候会有问题,出现了两个错误,首先第一个是num++出了问题,通过上边的简单解释就能发现,他的意思是说这里num是只能读的目标不能修改,第二个是add()大致意思就是你的test函数用const来修饰了。

所以这就是const在类中修饰成员函数的作用,第一个就是在这个函数内部不能对你当前类中的任意一个成员进行修改,只能读取。第二个就是你当前函数内部不能调用那些可以修改他的函数,就像上边即使去掉num++,这句话程序还是不能编译通过因为try1函数内部调用了修改成员变量的函数add,简单来说就是在这个程序执行区间内任何成员变量都不能被修改。

这里简单总结const的几个规则:

a.在类中被const声明的成员函数只能访问const成员函数,而非const函数可以访问任意的成员函数,包括const成员函数..
b.在类中被const声明的成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.

c加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的

 接下来介绍的另一个修饰函数的修饰词是inline内联。这是一个很特殊的修饰词,并且验证起来也并不是特别的容易,因为常常很多编译器帮你优化了很多,导致很多情况这个修饰词显得并不是那么的重要。这里简单的对这个关键字进行一个介绍,大家都知道函数的栈桢这么一说,我们在类中经常会出现一个成员函数调用另一个成员函数的情况,就比如之前的日期类,如果我要判断这个月有多少天,我就要调用今年是不是闰年的函数。这样函数就会进入我们所说的栈,压栈,这样程序会有一定的时间消耗,这里内联的意思就是在编译阶段类似宏替换的情况,我将类中成员函数通过宏替换将调用他的函数内部进行替换掉。这样就不会出现函数调用的情况,而是将你所调用函数的代码拷贝过来进行执行。

优点

1、内联函数,编译器将会根据上下文环境进一步深度优化代码,而这一点是普通函数无法达到的作用 
2、省略了函数调用压入堆栈和弹出堆栈所用的时间 
3、常用于高频使用的函数,可以提高时间

缺点

1、编译之后代码量会偏多,内联可以说是一种以空间换取时间的方法。牺牲一定的空间来加速运行时间。增加的代码量取决于函数调用次数和函数本身的大小 
2、内联函数实现的更改往往并不可以保持链接兼容性,也就是说这样的更改需要用户重新编译他们的代码

综述与注意

1、inline实现其实就是对编译器的一种请求,因此编译器完全有权利取消一个函数的内联请求。一个好的编译器会根据函数定义体,自动取消不值得的内联,一般编译器会自动过滤选择一些短小而简单的函数来内联 
2、使用内联函数的时候要注意: 
(1)递归函数不能定义为内联函数 ,这个一定要注意不要什么函数都写成内联
(2)内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。 
(3)内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。