关于常对象为什么只能调用常成员函数
什么是常对象,就是加了一个const就是的对象;常成员函数 表示该成员函数不能修改数据成员的值。格式:
返回值类型 函数名(形参列表) const {
函数体内容;
}
概念结束
先引入指针为例:
#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类型的指针
对于对象来说的话
#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指针的类型不同也会构成函数的重载,就相当于新建对象去找另外一个成员函数的方法了,而这肯定是不存在的
#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;
}
这样写不会报错,函数也没有被重复定义