目录
常函数不能对普通成员变量(除mutable修饰外)进行写操作
常函数可以被普通对象或者常对象调用
常对象不能调用所有普通函数,只能调用常函数
常对象可以读成员变量
常函数和常对象
常函数
常函数声明方式
返回值 函数名称 (参数) const;
class Person : public QMainWindow
{
Q_OBJECT
public:
Person();
Person(const int i);
Person(const int i,const QString C_name);
Person(const Person & p);
~Person();
int Age;
QString name;
void Const_func() const;//常函数的声明
};
上述
void Const_func() const;//常函数的声明
为常函数的声明
具体定义如下:
void Person::Const_func() const
{
}
常函数,只能访问成员变量,不能修改,在常函数中成员变量均是只读(only-read)
成员函数中访问成员变量都是借助this指针,又因为this指针永远指向调用函数的对象,所以相当于
Person * const this;
指向是固定的,但是访问变量可以修改值
但是在常函数中,this指针再次受到了限制:
const Person * const this;
如果在常函数中改变成员变量,编译器会报错:
void Person::Const_func() const
{
this->Age = 20;
}
在常函数中只能读取,不能写!
void Person::Const_func() const
{
qDebug()<<this->Age;
}
普通对象和常对象都可以访问常函数 ,常对象只能访问常函数
常对象(包括常指针和常引用)
常对象只能访问常函数,读成员变量,无法写
const 类名 对象名;
只能访问常函数,访问其他函数会报错
void Person::test()
{
this->Age = 30;
}
const Person C_p;
qDebug()<<C_p.Age;
C_p.test();
程序会报错:
对test( )函数进行修改
void Person::test()
{
// this->Age = 30;
qDebug()<<this->Age;
}
依旧会报错:
对test()再次修改:
void Person::test()
{
}
综上可见, 常对象只能访问常函数,不管普通函数中有没有写操作,都不能访问
只能读成员变量,不能写
const Person C_p;
C_p.Age = 10;
qDebug()<<C_p.Age;
程序报错
常对象访问普通成员变量,只能读,不能进行写操作!
使用关键字mutable
在成员变量前面加上mutable,即可在常函数中进行访问
在类成员变量前面加上mutable关键字:
mutable int Age;
常函数即可对该成员变量进行写操作。
void Person::Const_func() const
{
this->Age = 30;
qDebug()<<this->Age;
}
常对象也可以对该成员变量进行访问
const Person C_p;
C_p.Age = 10;
总结
常函数不能对普通成员变量(除mutable修饰外)进行写操作
常函数可以被普通对象或者常对象调用
常对象不能调用所有普通函数,只能调用常函数
常对象可以读成员变量
常对象,作为参数时,一定要务必注意!形式参数和实际参数属性应该相同
下面看一道题目:
#include<iostream>
using namespace std;
class R{
public:
R(int r1,int r2){
R1=r1;
R2=r2;
}
void print()
void print() const;
private:
int R1,R2;
};
void R::print(){
cout<<R1<<","<<R2<<endl;
} void R::print() const{
cout<<R1<<","<<R2<<endl;
}
int main(){
R a(6,8);
const R b(56,88);
b.print();
return 0;
}
const R b,其中的b是常对象,只能访问常函数
访问的是void R::print() const
答案 56,88。