在学C++的时候,必不可少的是const,他或许在C语言中是可有可无的,但是在C++中绝对不是,我们在学习C语言的时候,我们知道的是,经常有人说加const是为了保证“安全”,那么,所谓的“安全”是什么呢?其实,这里的安全相信大家也是全部知道的,有些人或许心里会想,不就是保证数据不被更改吗?这有什么的,没错,是为了保证数据不被更改,但是,我想在这里说的是,你知道什么时候加const吗?总有迷糊的时候,今天在写模拟实现STL中的list的时候,我突然有点迷糊。大家看看下面的这个代码:
我在两个const_iterator的前面画了两个箭头,大家觉的在两个前面带要不要加const呢?我想说的是,其实我自己刚开始也是很迷糊,我也不知道到底加不加,但是,我刚刚突然想到的是,其实加不加都不影响,这又是为什么呢?为什么我又说加不加不影响。我不知道大家想过没有,当你正在纠结这里到底要不要加const的时候,其实大部分都是写到了这个代码(不知道大家有没有写过这个代码,反正我是写到了):
不知道有没有兄弟这样写过,刚开始我想的浅,因为是const的list,所以迭代器只能用const_iterator,所以这个返回的也是const_iterator的,所以我就想的是让其引用,但是我写了这个代码,才发现错了,那么,错哪了呢?两个类型都是一样的,我仔细想了之后,才发现,这里是传值返回啊,会出现一个临时变量,临时变量具有常性,我感觉突然拨云见日,但是如果这样写,还有一个小错误,虽然编译可以通过,但是我不知道大家想过没有,其实 “严格”来说,我个人认为是有内存泄漏的。那么肯定又有人迷糊了,又是拿来的内存泄漏呢?其实在他产生临时变量的时候,他会进行拷贝构造,而我们没有写拷贝构造函数,所以他会进行浅拷贝,浅拷贝正好符合我们的心意,我们这里用了一个匿名的类,所以会自动析构,这不用我们说。所以这里的这个引用就是引用的是临时变量,是这个临时变量的别名,而这个临时变量不会一直存在,他返回之后会消除,但是你运行的时候还是正常运行,这个又是为什么呢?因为他这个类的成员变量是在堆区开辟的,而又因为我们这里没有析构函数,所以就没有释放这个申请的空间。(此处的内存泄漏是自我认为,其实也是对的,因为最后这个list会析构,我说的内存泄漏指的是临时变量销毁的那一瞬间)
所以正因为是传值返回,不管你在不在这个函数的前面加const,只要是你引用,你就得加const,因为它产生的临时变量是常性,但是我个人认为是直接不要引用传值返回的函数,以为在把这个返回值返回给你的时候,这里是会出问题的,因为list是刚好不需要在迭代器类中析构,所以可以正确,如果是其他的地方呢?是不是就出错了。
然后返回主题,const到底加不加,加了的话,代表传值返回的是一个常量,然后会产生一个临时变量,临时变量具有常性,不加的返回的是一个变量,但是产生的临时变量依然具有常性,所以,我认为这里是加不加都可以,不影响。
那么,对此,大家的意见是什么呢?希望大佬可以在说出自己的意见(如果本文有错误,希望大家指出,因为是自己所想)。