• 关于常对象为什么只能调用常成员函数


    什么是常对象,就是加了一个const就是的对象;常成员函数 表示该成员函数不能修改数据成员的值。格式:

    返回值类型 函数名(形参列表) const {

            函数体内容;

    }

    概念结束

    先引入指针为例:

    1. #include
    2. using namespace std;
    3. void fun(int *p){
    4. cout << "接收普通指针的普通方法 " <
    5. }
    6. void const_fun(const int *p){
    7. cout << "接收常量指针的普通方法 " <
    8. }
    9. int main()
    10. {
    11. int a=10;
    12. int *p1=&a;
    13. const int *p2=&a;
    14. fun(p1);
    15. //fun(p2);//error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
    16. const_fun(p1);
    17. const_fun(p2);
    18. return 0;
    19. }

    const类型的指针无法转化为普通指针,普通指针可以转化为const类型的指针

    对于对象来说的话

    1. #include
    2. using namespace std;
    3. class Person {
    4. private:
    5. string name;
    6. int age;
    7. public:
    8. Person(){}
    9. Person(string name,int age):name(name),age(age){}
    10. void show(){
    11. cout << "i am person" <
    12. }
    13. };
    14. int main() {
    15. const Person p1("张三",18);
    16. p1.show();//error: passing 'const Person' as 'this' argument discards qualifiers
    17. return 0;
    18. }

    常对象无法调用非常成员函数,以上代码会报错

    我们应该知道,在一个非静态成员函数中存在一个隐藏的this指针,如果这个this指针的类型不同也会构成函数的重载,就相当于新建对象去找另外一个成员函数的方法了,而这肯定是不存在的

    1. #include
    2. using namespace std;
    3. class Person {
    4. private:
    5. string name;
    6. int age;
    7. public:
    8. Person(){}
    9. Person(string name,int age):name(name),age(age){}
    10. void show(){
    11. cout << "i am person" <
    12. }
    13. void show()const{
    14. cout << "i am person" <
    15. }
    16. };
    17. int main() {
    18. const Person p1("张三",18);
    19. p1.show();
    20. return 0;
    21. }

    这样写不会报错,函数也没有被重复定义

  • 相关阅读:
    Workbench环境中常见问题
    一对多关系实现部门—>员工的查询
    【C语言】Debian安装并编译内核源码
    【行为型模式】命令模式
    浅聊我和一些编程语言的缘分
    【Hive】建表时的存储格式
    VINS系统框架--原理剖析
    第二章:OSI参考模型与TCP/IP模型
    全向移动机器人运动参数校准
    深入浅出DAX:数据分析
  • 原文地址:https://blog.csdn.net/weixin_53762703/article/details/133825650