目录
一、引言
二、const关键字与变量
2.1 、const修饰基本数据类型
2.2、const修饰指针类型
2.2.1、const在 * 号之前
2.2.2、const在*号之后
三、const关键字与引用
3.1 权限放大
3.2 权限缩写
四、cosnt关键字与类
4.1、修饰成员变量
4.2、修饰成员函数
const是C和C++中一个十分重要的关键字,它在变量,函数,类,引用,指针中的有着十分重要的作用,本文将详细介绍const关键字在C++中的作用。
首先,讲解const关键字修饰变量,将从两个方面讲解。
在平常代码的编写中我们有时并不希望一些数据被修改,我们可以用const关键字对其进行修饰例如下面的代码 ,对于const修饰的a来说 a的值是无法修改的。
int main()
{
const int a = 5;
//此时a被const所修饰变量a是无法被修改的
//a = 10;
return 0;
}
但是通过取出a的地址,对a进行解引用操作最终还是能够修改a的值但是这样就失去了const关键字的作用。
注:const修饰的a虽然能够被修改但是a仍然是变量并不是常量,我们可以通过下面的代码进行验证,在C99中是不支持变长数组的,如果const修饰的NUM是常量,那么就可以在数组创建时写成int a[NUM];但是编译器会报错,说明const修饰的依旧是变量。
int main()
{
const int NUM = 5;
int a[NUM];//此处在C99中会报错
return 0;
}
const对于指针也有着十分重要的作用,分为两种情况
当const在 * 号之前时(const int * 或 int const *)是对指针中的内容进行修饰,代表指针中的内容是无法修改,但是指针的指向是可以改变的,如下面的代码所示。
当const在 * 号之后时(int * const)是对指针的指向进行修饰,指针的指向不能够被修改,但是指针中的内容是可以被修改的,如下面的代码所示。
在C++中const对于也有很大的作用,将从两个s方面进分析
对于const 修饰的a来说 ,a已经被const修饰了,那么对于b来说b是a的别名,那么b可以修改a中的内容,但是a被const进行了修饰,说明int &b = a把 a权限进行了放大是不被允许的。
int main()
{
const int a = 10;
//权限放大,编译器报错
//int &b = a;
return 0;
}
还有一种权限放大的情况是 int &a = 10 对于10来说 10是常量是不能够被修改的但是对于a 是10的引用,可以对10进行修改,这也是一种权限的放大是不被编译器允许的。
在C++中对于一个int类型的变量可以是可以进行权限的缩小的,如下面代码所示,定义一个int类型的变量c。const修饰的引用b是c的别名,对于b来说,由于b是由const修饰的,所以b无法对c中的内容进行修改,这是允许的,是权限的缩小。
int main()
{
const int a = 10;
int &b = a;
return 0;
}
在定义的类中成员变量也可以用const进行修饰,被const关键词修饰的成员变量,也是不能够被修改的
注:在一个类中的const 成员变量只能在构造函数中的初始化列表被初始化!
原因:因为const修饰的变量只能够初始化,不能够赋值,在进入函数体内const变量都已经用不确定的值初始化好了,构造函数做的只有赋值,而const类型不能够赋值,所以需要在初始化列表中初始化
class A
{
public:
class A(int aa)
:_aa(aa)
{}
//编译错误 const修饰的成员变量无法被修改
/*void func()
{
_aa = 10;
}*/
//编译错误
/*class A(int aa)
{
_aa = aa;
}*/
private:
const int _aa;
};
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。如下面的动物类为例定义一个const成员函数。
class Animal
{
public:
Animal(char* name, char* kinds)
{
_name = name;
_kinds = kinds;
}
void print() const
{
//const成员函数 成员变量不能修改否则编译器一定会报错
//_name = "猫";
cout << _name << _kinds << endl;
}
private:
char* _name;
char* _kinds;
};
在成员函数的后面加上const代表该函数是成员函数,成员变量是不能被修改的
有关const static相关的详细使用:类和对象(下)/类和对象(下) · 懒惰的西望/lazy_study_cpp - 码云 - 开源中国 (gitee.com)