赞
踩
将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this 指针,表明在该成员函数中不能对类的任何成员进行修改。
格式为 void menberFun() const
因为this指针是隐含的,我们无法在this指针前添加const,所以我们只能在函数后面加const
class A { public: void setA(int a) //this : A* const 指向不能改变 { _a = a; } int getA() const // this : const A* const 指向和内容都不能改变 { _a = 10; return _a; } private: int _a; };
被const修饰后的this指针,指向的对象的属性值不能被改变
下面我们来更加深刻的理解在类中const的用法:
我们必须先了解:对象的权限(可读可写)可以缩小,但是不能被放大。
前两问类代码:
class A { public: void setA(int a) //this : A* const 指向不能改变 { _a = a; } int getA() const // this : const A* const 指向和内容都不能改变 { return _a; } private: int _a; };
1、const对象可以调用非const成员函数吗?
不可以,被const修饰后的对象的属性值不能被修改,而setA函数 是可以修改对象的方法,权限放大,所以不可以
2、非const对象可以调用const函数吗?
可以,这里getA函数的this指针是被const修饰的,而我对象是非const,从可读可写变成只读,属于权限缩小,可以被接受,所以是可以的
后两问类代码:
class A { public: void setA(int a) { _a = a; getA(); //调用const修饰的成员函数 } int getA() const { setA(); //调用非const的成员函数 return _a; } private: int _a; };
3、const成员函数内可以调用其它的非const成员函数吗
不可以,在getA函数中this是const修饰的,权限为只读,而在该函数中调用了另一个非const的成员函数,权限为可读可写,此时权限放大,所以不可以
4、非const成员函数内可以调用其它的const成员函数吗
可以,从可读可写变为只读,权限缩小,可以被接受,所以可以
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比 如想让别人获取到指定的内容!
class A
{
public:
//取地址操作符重载
A* operator&()
{
return this;
}
//const取地址操作符重载
const A* operator&() const
{
return this;
}
};
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。