欢迎来到CILMY23的博客
本篇主题为: C/C++中新const用法:const成员
个人主页:CILMY23-CSDN博客
系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux
感谢观看,支持的可以给个一键三连,点赞关注+收藏。
写在前头:
在接触C++中 const成员前,我们可以先复习一下C/C++中两种 const 的用法。在指针的入门篇我们写过的知识点(链接),我们主要分为以下两种情况:
- const关键字可以限制变量不被修改,但是存在可以用指针修改的情况。
- const如果放在 * 的左边,限制的是指针所指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。
- const如果放在 * 的右边,限制的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针所指向的内容,可以通过指针改变。
- 如果 * 两边都有const,那它就会集齐两者,使其变成完全不能修改的指针变量。
那现在函数名称后面居然可以写上const了?那它又是什么意思呢?
目录
一、认识const成员
二、const成员的概念及特点
2.1 const 成员的概念
2.2 const成员函数的四个问题
2.3 权限的放大什么时候存在?
三、取地址重载和const取地址重载
一、认识const成员
继上篇日期计算器后,现在有一个问题
我们来看这段代码:
在main函数中,我们用 const 修饰了对象 ,
int main()
{const Date d1(2024, 5, 6);d1.Print();return 0;
}
但是这里却无法访问到Print() 成员函数,其实这里涉及权限的放大
那如果我们想让它变成可访问的,那就要在成员函数后面增加 const ,这个const修饰的是this指针指向的内容。
//Date.cpp
//日期打印
void Date::Print() const
{cout << "当前日期:"<< _year << "/"<< _month << "/"<< _day<< endl;
}//Date.h
//日期打印
void Print() const;
我们把这里的Print(),就称为const成员函数。
二、const成员的概念及特点
2.1 const 成员的概念
我们将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
注意:并不是所有的成员函数都需要用const修饰,如果只有读取的类成员函数,那么可以加,如果需要修改类成员变量,那就不能加const。
2.2 const成员函数的四个问题
- const对象可以调用非const成员函数吗?
- 非const对象可以调用const成员函数吗?
- const成员函数内可以调用其它的非const成员函数吗?
- 非const成员函数内可以调用其它的const成员函数吗?
第一个:const对象可以调用非const成员函数吗?
答:不能,因为这里存在权限的放大,d1是const对象,但它不能调用非const成员函数,
第二个: 非const对象可以调用const成员函数吗?
答:可以,这样是权限的缩小,是允许的。
第三个:const成员函数内可以调用其它的非const成员函数吗?
答: 不行,因为这是权限的放大
第四个:非const成员函数内可以调用其它的const成员函数吗?
答:可以,这是权限的缩小
2.3 权限的放大什么时候存在?
只有指针和引用才存在权限的放大。
例如:
三、取地址重载和const取地址重载
类的默认成员函数还剩下取地址重载和const取地址重载,这两个默认成员函数一般不用重新定义,编译器默认会生成。
例如:
class A
{
public:A* operator&(){return this;}const A* operator&() const{return this;}
};int main()
{A aa1;const A aa2;cout << &aa1 << endl;cout << &aa2 << endl;return 0;
}
结果如下:
这两个运算符一般情况下我们不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
总结:
- 函数后面有 const ,这个const修饰的是this指针指向的内容。
- 权限可以平移或者缩小,但不可以放大
- 成员函数,如果是一个对成员变量只进行读访问的函数,那么建议加 const,这样const对象和非const对象都可以使用
- 成员函数,如果是一个对成员变量要进行读写访问的函数,那么不能加 const,否则不能修改成员变量。
- const不能加在日期计算器中的流插入和流提取中,因为它没有this指针。
- 比如想让别人获取到指定的内容,我们才需要重载&运算符和const &。
感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。