【C++】const关键字的详解!!

2023-12-13 19:00:07

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

引用:

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对象,会造成权限放大。

文章来源:https://blog.csdn.net/luhaoran814/article/details/134816112
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。