【C++】const关键字的详解!!
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 引用:
- 一、const修饰范围
- 二、const修饰指针,常量,
- 1.情况一
- 情况二
- 情况三
- 三、修饰类的成员函数
- 1.格式:
- 2.为什么要使用const修饰成员函数?修饰的是谁?
- 3.函数访问时的权限问题
引用:
const关键字是永恒不变的意思,用它修饰的关键字只具有度的特性,没有办法进行写操作。const常变量只在编译期有用,在运行期无用,可以很好的增加程序的健壮性,防止一些不必要的变量被错误修改引发的程序问题。const修饰的变量是只读的,本质还是变量。
现代C编译器(如Vc、gcc)中的const将具有全局生命周期(如全局变量,static属性的变量)存储于只读存储区,修改该变量时将导致程序崩溃。【注意】标准C语言编译器(如bcc)不会被const修饰的全局变量存储于只读存储区,而是存储于可修改的全局数据区,其值依然可以改变。
一、const修饰范围
(1)定义常量,和define语句类似。但是相比较而言,使用const在很多编译器中是不会给分配空间的,这样可以大大减少内存的使用量。
(2)const修饰函数形参。const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化;
(3)const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值。
(4)修饰函数返回值。参数可以直接赋值给一个常量或者指针。const修饰函数返回值表示返回值不可改变,多用于返回指针
的情形。
(5)修饰成员函数,形参后加const,其实是用来修饰this。来保证this的成员变量不可变。
二、const修饰指针,常量,
1.情况一
首先,我们要清楚, int* const pa = &a;中的
pa
是一个指针,而*pa
是指针的解引用,是指针指向的值。
int* const pa = &a;
可以发现【pa = &b;】直接对pa的内容修改是不行的。但是【*pa = b;】可以通过指针去修改其内容。也就是说,const此时修饰的是pc
。
情况二
const int *pa = &a;
可以发现【pa = &b;】直接对pa的内容修改是可以的。但是【*pa = b;】不可以通过指针去修改其内容。也就是说,const此时修饰的是*pa
。
情况三
int const* pa = &a;
结果证明,这种const所处位置造成结果与情况二一致。
三、修饰类的成员函数
1.格式:
void Print()
const
{}
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print() const
{
cout << "Print()" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
这里的const修饰形参中的隐藏参数相当于Date *const
this。
2.为什么要使用const修饰成员函数?修饰的是谁?
答:(1)首先我们要清楚,类的成员函数中才会存在this指针。this指针是一个指向当前对象的指针,只有在成员函数中才有定义。this指针一般都是隐藏的,存在于形参列表的最左边。
(2)const修饰this指针指向的对象,这也就保证调用这个const成员函数的对象在内部不会被改变
注意:
非成员函数
,没有this指针,不能使用const修饰。
总结,如果成员函数不需要修改成员变量,最好加上const。反之,如果成员函数需要修改成员变量,那么久不能加const。cosnt修饰*this。
3.函数访问时的权限问题
允许原则: 权限平移,权限缩小,不能权限放大。
- 非const对象都可以访问const对象,权限缩小。
- const对象可以访问const对象,权限平移。
- const对象不能访问非const对象,会造成权限放大。