个人主页 : zxctscl
如有转载请先通知
文章目录
- 1. 前言
- 2. const成员
- 3. 取地址及const取地址操作符重载
1. 前言
在之前已经已经分享过了关于 【C++】类和对象之常引用与运算符重载,这次分享的有关const的内容,话不多说,正文开始。
2. const成员
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
看看下面的代码
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
const Date d1(2024, 1, 1);
d1.Print();
return 0;
}
在这里为什么不能调用printf
呢?
为了解决这个问题在函数后面加const
这个是权限的平移。
#include <iostream>
using namespace std;
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()const
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
const Date d1(2024, 1, 31);
d1.Print();
Date d2(2024, 3, 31);
d2.Print();
return 0;
}
如果是像d2呢?
也可以用printf,这里是权限的缩小。
并不是所有的函数都能加上const。
总之:
成员函数,如果是一个对成员变量只进行读访问的函数,建议加const,这样const对象和非const对象都能使用。
成员函数,如果是一个对成员变量进行读写访问的函数,不加const,否则不能修改成员变量。
下面代码是权限放大吗?
不是,这里是拷贝,j的改变不影响i,也不存在所谓的权限方法。
这个才是权限的放大,r的改变影响i。
p2的改变会影响p1,也就是i。
权限的放大:指针和引用赋值才存在权限放大。
来看看下面的几个问题:
-
const对象可以调用非const成员函数吗?
不行,权限放大了 -
非const对象可以调用const成员函数吗?
可以,这里权限缩小 -
const成员函数内可以调用其它的非const成员函数吗?
不行,权限放大了 -
非const成员函数内可以调用其它的const成员函数吗?
可以,这里是权限的缩小
3. 取地址及const取地址操作符重载
如果&不是默认成员函数,那么重载才能使用。
如果每次使用都要重载,那么编译器就直接默认生成。
这两个默认成员函数一般不用重新定义 ,编译器默认会生成,不需要自己写,日常已经够用了。
class Date
{
public:
Date* operator&()
{
return this;
}
const Date* operator&()const
{
return this;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可。
只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
像这样普通对象能拿地址,const对象不能拿地址。
有问题请指出,大家一起进步!!!