C++中的const的用处

1 篇文章 0 订阅
1 篇文章 0 订阅

C++中的 const

说明:本篇主要针对const的重载用法进行讲解

首先,我们可以从const出现的位置来入手:

const 返回类型 函数名 (const 函数参数) const

如上述,const一共可以出现在三个位置,我们先讨论出现在前两个的const,显而易见,第一个const修饰的是函数返回值,表示该函数返回一个常量,必须用const修得”变量去接“;第二个const修饰的是函数参数,表示该函数的参数是const类型,在该函数体内无法改变该参数的值,注意作用域是该函数体,这能有效的提高函数的健壮性,用的很多,举个例子;

Array &Array::operator=(const Array &obj)
{
    if (&obj == this)
        return *this;

    if(m_p != NULL)
        delete [] m_p;

    m_p = new int[obj.m_len];
    m_len = obj.m_len;
    for (int i = 0; i < m_len; i++)
    {
        m_p[i] = obj[i];
    }

    return *this;
}

    这一串代码实现的是“数组中=”运算符的重载,如上所示,因为是赋值运算符的重载,所以不需要改变赋值量的参数,只需要改变被赋值量的参数即可,所以我们在传参时,给参数嫁了const这就不会因为不在预料之内“意外”导致obj的值在此后函数体内改变了,提高了函数的健壮性

那么最后一个const是干什么的呢?
这就涉及到了函数重载,众所周知,函数重载需要参数的类型,个数,顺序中至少一样是不相同的。此外const也可以作为函数重载的标志之一。
举个例子

clas
{
...
    int &operator[] (int index);                  //1
    int &operator[] (int index) const;            //2
    const int &operator[] (int index) const;      //3
...
}

...
int &Array::operator[](int i)
{
    //p[i] = 1;                               4
    return p[i];
}

const int &Array::operator[](int i) const
{
    //p[i] = 1;                               5
    return p[i];
}
...

    如上所示,12或者3中的任意一个都将构成函数重载,23不能构成函数重载;

    重复一下之前说的const加在最前面有什么作用,(即23的区别)
    当2运行结束后,可以被任意int类型的变量所接受;
    当3运行结束后,只可以被常量接受(即被const修饰);

    3const写在最后面,修饰的是this指针的,3这个函数是写在类里面的,它的原型其实长这样的:const int &operator[] (const Arrat *const this, int index);
由于写进类中函数后,左操作数省略(其实是 Arrat *const this 被隐藏了),const Arrat *const this前面的const“找不到家了”,于是把它放到了最后面。这便是最后面const的由来了。其实只要记住最后面如果有const,那么在该函数体中,所有调用该函数对象的参数都将无法改变,如上,4可以执行成功,5就不会成功了。

有关使用const进行函数重载的一些注意点:
如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指》> 针,起到保护作用
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传> 递”,目的是提高效率。
任何不会修改数据成员的函数都应该声明为const类型。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值