zoukankan      html  css  js  c++  java
  • c++ const 成员函数

    第一个事实:

    某类中可以这么声明定义两个函数,可以重载(overload)

    void pa(){
        cout<<"a"<<endl;
    }
    void pa() const{
        cout<<"b"<<endl;
    }

    上面的写法是正确的。

    基于这个事实,我思考了一下它的机制。

    试验得出,

    第二个事实:

    普通函数(不是类的成员函数),可以这样来重载(overload):

    void fun(const int &a)
    {
        cout<<a<<endl;
    }
    void fun(int &a)
    {
        cout<<a<<endl;
    }

    第二个事实说明了:如果函数参数是【引用类型】,那么【const】 和 【不加const】 可以重载。

    第三个事实:

    普通函数(不是类的成员函数),也可以用指针这样来重载(overload):

    void test(const int* a){
        cout<<*a<<endl;
    }
    void test(int* a){
        cout<<*a<<endl;
    }

    第三个事实说明了,指针也可以在前面加 const 和 不加const 来重载。

    分析第一个事实:

    按照c++ primer里面的说法,一个成员函数本身有一个隐式的参数: ClassName* const this//不要管这个const,跟本文主题无关.

    但是还是先来解释一下这个const,就是说,一个指针,本身不能再指向别人了,只能指向自己。

    所以,你在类里面不能更改this的值,

    this = 0;//错误!

    再来说这两个类成员函数:

    void pa();
    void pa() const;

    可以写全,成为好理解的伪代码,像这样:

    void pa(ClassName *const this);
    void pa(const ClassName *const this);

    第一个好理解,上面已经说过了。

    第二个就是,c++提供给使用者的一个特殊语法,就是说成员函数加const,这个const实际上就是加给了隐式参数this的前面。

    好了,总结:

    这就是为什么成员函数可以通过加const修饰符来重载。

  • 相关阅读:
    Java并发编程实战3-可见性与volatile关键字
    Java并发编程实战2-线程安全
    Java词频统计
    Java中split的对象被特殊字符(.或|)分隔
    Kernel Space与User Space(转)
    [Python]Pandas简单入门(转)
    Python的自省机制
    谈谈Python中元类Metaclass(二):ORM实践
    Python的垃圾回收机制
    [Python]Pip换源以及设置代理
  • 原文地址:https://www.cnblogs.com/onebook/p/4828836.html
Copyright © 2011-2022 走看看