浅谈C++中const类型变量和函数重载

  C++中定义const型变量,可以用一个非const型变量或者const变量初始化这个const变量,但是如果不用类型强制转换则不可以用一个const变量初始化一个非const变量。另外,我的观点是const只能修饰一个变量。


    上面的最后一句话,你可能有非议,我可以说明。第一,一个const不能修饰一个全局函数。第二,你可能举例说明C++的类中const可以修饰一个函数,但是你还记得每个函数中都可以用一个默认的this指针?C++编译的时候会在函数的参数列表中添加一个类的this指针(静态函数除外),此时如果函数被const修饰,则这个const实际上是修饰这个this的,const修饰的函数不能改变成员属性值,其原因也在此。


    所以可以通过const修饰变量来实现函数重载,即函数名称、参数个数、参数类别都一样,唯一的区别在于变量是否为const修饰。


    可能上面的解释太罗嗦了,还是一句“源码之前,了无秘密”:
class A
{
public:
    A() {}
    void func(int *a) //相当于void func(int *a, A *this)
    {
        std::cout << "_func_int_ptr_" << std::endl;
    }
    void func(const int *a) //相当于void func(const int *a, A *this)
    {
        std::cout << "_func_const_int_ptr_" << std::endl;
    }
    void func(int *a) const //相当于void func(int *a, const A *this)
    {
        std::cout << "_const_func_int_ptr_" << std::endl;
    }
    void func(const int *a) const //相当于void func(const int *a, const A *this)
    {
        std::cout << "_const_func_const_int_ptr_" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    A a;
    int nValue = 3;
    const int nValueCnst = 3;
    a.func(&nValue);
    a.func(&nValueCnst);

    const A aa;
    aa.func(&nValue);
    aa.func(&nValueCnst);
    return 0;
}


其输出为:
_func_int_ptr_
_func_const_int_ptr_
_const_func_int_ptr_
_const_func_const_int_ptr_


    从这里可以看出,通过const修饰一个变量可以实现同名称函数的重载。另外,一个类的非const对象可以调用其const函数,如果详细参考第一段的解释以及const函数编译过程,你应该能明白其中的缘由。原因就是可以用非const型对象非const型的this指针进行初始化时。


    一个简单的代码例子如下:
class A
{
public:
    A() { }
    void func(int *a) const
    {
        std::cout << "_const_func_int_ptr_";
    }
};

int main(int argc, char* argv[])
{
    A a;
    int value = 3;
    a.func(&value);
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值