绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
C++ 中不一样的重载
2022-04-01 16:12:58

以下文章来源于程序喵大人 ,作者程序喵  

关于什么是重载想必大家都知道,无非就是参数个数不同,参数类型不同可以重载,这里我就不过多介绍啦。

这里想分享C++中一个不一样的重载,即const重载。

可以看下面的代码:

struct A {
    int count() {
        std::cout << "non const" << std::endl;
        return 1;
    }

    int count() const {
        std::cout << "const" << std::endl;
        return 1;
    }
};

int main() {
    A a;
    a.count();
    const A b;
    b.count();
}

这段代码会输出什么?
?????

输出的是这样:

non const
const

不知道大家平时有没有关注过这种用法,没关注过可以继续向下看哈。

从上面的输出结果我们也可以看到,const修饰的对象调用的是使用const修饰的方法,非const对象调用的是非const的方法。
然而想必大家都知道对象调用的原理:
看下面的这段代码:

A a;
a.func();

其实到底层,函数可能会变成这样:

func(A* a);

函数是在代码段,对象是在数据段,调用不同对象的函数,其实只不过是同一个函数,传递了不同的数据参数而已。
上面的是把对象的this指针传进去。
再回到上面的代码:

struct A {
    int count() {
        std::cout << "non const" << std::endl;
        return 1;
    }

    int count() const {
        std::cout << "const" << std::endl;
        return 1;
    }
};

可以理解为:

int count(A *);
int count(const A*);

咦,这不就是重载吗,难道还有const重载?
还真有,看下这段代码:

struct A {
    int count(const int& s) {
        std::cout << "const" << std::endl;
        return 1;
    }

    int count(int& s) {
        std::cout << "non const" << std::endl;
        return 1;
    }
};

int main() {
    A a;
    a.count(4);
    int c = 5;
    a.count(c);
}

输出如下:

const
non const

所以得出结论:

不只是参数类型和个数不同会产生重载,const修饰的参数也会有重载。

但是只有当const修饰的是指针或者引用类型时才可以,普通的int和const int会编译失败的,具体大家可以自己写代码试试。

这里大家也可以想想,问什么一定要指针或者引用类型时重载才可以呢?

- EOF -

分享好友

分享这个小栈给你的朋友们,一起进步吧。

C语言编程开发
创建时间:2019-12-03 10:46:09
C语言C++知识内容传递,让编程变得更容易。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • jasonhsp
    栈主
  • gaokeke123
    嘉宾

小栈成员

查看更多
  • ?
  • 小尾巴鱼
  • karspb
  • nt1979
戳我,来吐槽~