const 常量_一文弄懂c++ 关键字const

ae9148fd6604bdffc599adec9366325b.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++ 知识点需要注意的基本就这些,如果上面某些用词不准确,欢迎各位指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值