zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    kolla-ansible安装openstack(Ocata)
    OpenStack 虚机网卡的创建过程
    C语言 IPv6 十六进制 转 十进制
    python IPv6 十进制和十六进制互转
    ICMPv6 Packet Types and Codes
    scapy IPv6 NS NA报文构造
    最接近的数 牛客网 程序员面试金典 C++ Python
    最近公共祖先 牛客网 程序员面试金典 C++ Python
    有向路径检查 牛客网 程序员面试金典 C++ Python
    检查是否是BST 牛客网 程序员面试金典 C++ java Python
  • 原文地址:https://www.cnblogs.com/menggucaoyuan/p/2083255.html
Copyright © 2011-2022 走看看