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

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

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

函数体内容;

}

概念结束

先引入指针为例:

cpp 复制代码
#include <iostream>

using namespace std;
void fun(int *p){
    cout << "接收普通指针的普通方法 " <<endl;
}
void const_fun(const int *p){
    cout << "接收常量指针的普通方法 " <<endl;
}
int main()
{
    int a=10;
    int *p1=&a;
    const int *p2=&a;
    fun(p1);
    //fun(p2);//error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
    const_fun(p1);
    const_fun(p2);
    return 0;
}

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

对于对象来说的话

cpp 复制代码
#include <iostream>

using namespace std;

class Person {
private:
    string name;
    int age;
public:
    Person(){}
    Person(string name,int age):name(name),age(age){}
    void show(){
        cout << "i am person" <<endl;
    }
};

int main() {

    const Person p1("张三",18);
    p1.show();//error: passing 'const Person' as 'this' argument discards qualifiers

    return 0;
}

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

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

cpp 复制代码
#include <iostream>

using namespace std;

class Person {
private:
    string name;
    int age;
public:
    Person(){}
    Person(string name,int age):name(name),age(age){}
    void show(){
        cout << "i am person" <<endl;
    }
    void show()const{
        cout << "i am person" <<endl;
    }
};

int main() {

    const Person p1("张三",18);
    p1.show();
    return 0;
}

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

相关推荐
wuminyu8 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
All for pursuit.9 小时前
【回溯-6】79.单词搜索
数据结构·c++·算法·leetcode
掉进电商坑三年没爬出来的东叔9 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust9 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
Benny_Tang9 小时前
AT_arc180_d [ARC180D] Division into 3 题解
数据结构·c++·算法
殷色玫瑰10 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同10 小时前
java输入输出+方法
java·开发语言·python
滕州市燕猫虎计算机科技工作室个体工商户10 小时前
《Rust程序设计》学习笔记一
开发语言·rust·学习笔记·rust程序设计
Wang's Blog10 小时前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud
努力努力再努力wz10 小时前
【CUDA入门系列】CUDA编程实战:设备选择、显存管理、Kernel、Stream 与 Event 全流程梳理
开发语言·c++