目录
1const修饰的成员函数
2.取地址及const取地址操作符重载
本篇讲述以上内容
const修饰的成员函数
首先,我们看一下下面这个类
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
void print()
{
cout<<"print()"<<end;
cout<<_a<<" "<<_b<<endl;
}
void print() const
{
cout<<"print() const"<<end;
cout<<_a<<" "<<_b<<endl;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A1.print();
A2.print();
}
我们执行一下这个代码会看出,这两个对象调用了不同的打印函数,这是因为,A1这个对象,没有被const修饰,即A1这个对象有可读可写权限,则会调用第一个打印函数,而A2这个对象有const修饰,只有可读权限,因此,则会调用第二个打印函数。
const修饰的成员函数:在成员函数后+const
即void print() // 等价于 print(A* const this)
void print() const //等价于 print(const A* const this)
const成员函数中的const修饰的为第一个参数,即this指针
const成员函数内部补能修改成员变量的值
总结:
1.非const修饰的对象,可以调用非const成员函数以及const修饰的成员函数,因为其读写权限只有缩小。
2.const修饰的对象,只能调用const修饰的成员函数,不能调用非const修饰的而成员函数,因为其只有读权限,不能放大其权限
取地址及const取地址操作符重载
有了上面对const修饰的成员函数调用的理解后,我们来看最后两个默认函数:
普通对象默认取地址重载,const修饰的对象取地址重载。
首先我们先看这这个类
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
}
依旧const修饰A2这个对象如果我们想要定义一个A类型的指针分别取A1和A2两个对象的地址,则我们要写成如下
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A* pA1 = &A1;//取A1地址
const A* pA2 = &A2;//取A2地址
}
这里的**&**,就是取地址重载函数,它也是编译器为我们自动生成的,如果显式定义,则如下
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
A* operator&()
{
return this;
}
const A* operator&() const
{
return this;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A* pA1 = &A1;//等价于A1.operator&()
const A* pA2 = &A2;//等价于A2.operator&() const
}
通常,这两个函数我们不显式定义,因为返回的地址是可以自己改的,如果随意修改返回的地址,则可能会有不可预计的后果。