![ae9148fd6604bdffc599adec9366325b.png](https://i-blog.csdnimg.cn/blog_migrate/cd0315faf66dca27dd8fc12e468ca3e5.png)
写在前面
看到 c++ 的关键字 const,我们的脑海里能够想到什么呢?
都到 2020 年了,不会真有人只知道 const 修饰常量吧,不会吧,不会吧!!!
当然,只知道这个层面也没关系,这篇文章会带领大家重新认识一下关键字 const,以后在面试的时候也能够给面试官吹吹牛逼了。
主题概括
const 除了修饰常量外,更重要的应用是修饰函数,放在函数不同的位置起到的作用也不同哟。接下来文章将以以下三部分展开:
- const 修饰函数参数
- const 修饰函数返回值
- const 修饰 this 指针
const 修饰函数参数
int getVal(int arg,const Sale_Item &item);
Sale_Item 是一个用户自定义类,Sale_Item &item 表示 Sale_Item 以引用的方式创建了一个对象。
这里可能有人就有疑问了。为什么要用引用的方式呢?平常我们不是直接创建一个对象就完了吗?就像下面这样。
Sale_Item item;
我们平常在 main 函数里面创建对象确实是这样,但是与这里是有区别的。
main 函数里面通常构建对象就一次,不会重复构建。但是函数是会被多次调用的。如果写成以下这样,
int getVal(int arg,Sale_Item item);
那么每次调用一次函数就要构建一个对象,每次都会产生一个临时对象,临时对象的构造、拷贝和析构都很耗时间,这样是非常影响效率的。
而引用传递不是值传递,不会涉及拷贝这种操作,就像一个东西贴上不同的标签,虽然根据标签有不同的叫法,但总归是一样东西。所以也不会产生临时对象。但这时有一个问题,就是如果我更改了一个引用对象,那不是牵一发而动全身,全部都改了?
说的没错,为了避免这种情况的发生,我们就使用了 const 来修饰,保证了这个引用对象是不可修改的,进而解决了这个问题,所以就有了一开始的那行代码。
但是这就结束了吗?too young too simple。。。
还是架不住好学的你们啊!╮(﹀_﹀)╭有人就来问了,既然引用这么牛逼,那岂不是。。。
可以这样?
int getVal(const int &arg,const Sale_Item &item);
或者这样?
int getVal(const int arg,const Sale_Item &item);
虽然你们很好学,但是很遗憾地告诉你们,这样的写法是完全没必要的。
首先,对于 int 这些内置数据类型,根本就不存在类的构造和析构的过程,复制的效率与加引用相差无几,而且引用还要考虑它的风险。这样做有些画蛇添足。
其次,函数会产生临时变量来复制 int 等内置数据类型参数,参数无需进行保护,也就不用 const 修饰了。
const 修饰函数返回值
const char* getID();
指针返回加 const 代表函数返回值(指针)不能被修改。并且该返回值只能赋值给 const 修饰的同类型指针。如
const char* id = getID();
当然也不用在内置数据类型返回时加 const,如下面的是没必要的。
const int getNum();
理由同上,函数返回值会复制到外部的临时存储空间内。
总之,只要记住 const 是起到保护数据作用的,而复制操作本身就保证了数据的安全性,所以没必要多此一举。返回引用可以加 const 为常量引用。如下
const Item &getVal();
const 修饰 this 指针
this 指针本身是类成员函数的一个隐性参数,本来应该在『const 修饰函数参数』里提及,但是由于比较重要,所以只能在这里给你们开个小灶。
言归正传,以前肯定见过如下代码。
Sale_Item() const;
这种代码为什么把 const 写在外面呢?难道是响应时代的召唤,也开始特立独行起来?
其实这行代码表示 Sale_Item 这个类的一个构造函数。
const 修饰的是 this 指针,为什么把它写在外面呢?
因为 this 指针是隐性参数,也就是说不能在函数参数里面直接定义这个参数,但是在构建成员函数的时候又会附带上这个 this 指针。
就像我们平常买一些进口食品,我们买这些进口食品除了支付它的价值外,还要承担一定的关税,这个关税我们平常看不见摸不着,但是它确确实实存在的。this 指针就像这个关税,看不见但又确实存在。
这个比喻可能比较牵强,但是大概这个意思,this 指针是隐性的。因为 this 指针是隐性的,那我们如果要用 const 修饰 this 指针所指的对象,只能把 const 加在函数末尾。
这里强调一下,this 指针本身是一个常量指针,它指向的地址就是一个常量地址。比如上面的代码,this 指针指向 Sale_Item 类的地址,这个地址是一个常量,类创建后就不会改变。而加上 const 后这个成员函数就不能修改 Sale_Item 这个类的任何东西。
最后
关于 const 关键字的 c++ 知识点需要注意的基本就这些,如果上面某些用词不准确,欢迎各位指出。