目录
const成员
概念
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数
隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
const实质上修饰的是this指针指向的内容,this指针是类的成员函数的一个形参,因此const是无法修饰全局函数的,因为全局函数没有this指针。
const修饰函数的条件
Const对象可以调用 非const也可以调用。
能否加const取决于是“读函数”还是“写函数”。
总结:如果是一个对成员变量只进行读访问的函数->建议加const,这样const对象和非const对象都可以使用成员函数。
如果是一个对成员变量只进行写访问的函数-不能加const,否则不能修改成员变量。
引入:const在传值传参时的应用
Const int i=0;
Int j=i;这里是拷贝,j改变不影响i
Int& r=i;传引用,r的改变影响i
权限放大—指针和引用赋值才存在权限放大
Const int*p1=&i;
Int* p2=p1;
临时变量具有常性,临时变量常出现的两个场景--》类型转换,返回值。
我们来看看下面的代码
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << "Print()" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
void Print() const
{
cout << "Print()const" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
void Test()
{
Date d1(2022,1,13);
d1.Print();
const Date d2(2022,1,13);
d2.Print();
}
思考下面的几个问题:
(按照引入的内容中权限的放大与缩小的思想来看这些问题就变得很简单)
1. const对象可以调用非const成员函数吗?不能,权限放大了。
2. 非const对象可以调用const成员函数吗?可以,权限缩小了。
3. const成员函数内可以调用其它的非const成员函数吗?不能,权限放大了。
4. 非const成员函数内可以调用其它的const成员函数吗?权限的缩小。
取地址及const取地址操作符重载
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
class Date
{
public :
Date* operator&()
{
return this ;
}
const Date* operator&()const
{
return this ;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需
要重载,比如想让别人获取到指定的内容!