const主要是用来防止定义的对象再次被修改,定义对象变量时要初始化变量
const可用于修饰变量、指针、函数参数和返回值、类数据成员、类成员函数、对象
(1)修饰变量
用于定于常量变量,这个变量在后面就不可被修改
const int Val = 10;
//Val = 20; //错误,不可被修改
(2)修饰指针
主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本身为常量;
①指向const变量的指针:
②const指针
const int *ptr; //*ptr为常量;
int const *ptr; //*ptr为常量;
int* const ptr; //ptr为常量;
const int * const ptr; //*ptr、ptr均为常量;
(3)修饰函数参数和返回值
保护传参时参数不被修改:如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护
void fun1(const int &val)
{
//val = 10; //出错
}
void fun2(int &val)
{
val = 10; //没有出错
}
void main()
{
int a = 2;
int b = 2;
fun1(a); //因为出错,这个函数结束时a的值还是2
fun2(b);//因为没有出错,函数结束时b的值为10
}
使用引用传入参数提高了效率,如果按值传递的话,函数中得创建临时变量,将这些值复制一遍,引用则不用。如果按值传入参数,就不需要const修饰。
修饰函数返回值,防止返回值被修改
(4)修饰类成员变量
使用const修饰的变量必须初始化,在类中又不能在定义时初始化,
初始化const int类型(没有static),在类的构造函数中初始化列表中初始化。
#include<iostream>
using namespace std;
class Test
{
public:
const int i;
int m;
//const int i = 10;//错误
Test(int x):i(10)
{
m = x;
}
};
int main()
{
Test t(15);
Test s(20);
cout << t.i << " " << t.m;
}
在这个程序中,i 是一个常量数据成员,在每个对象中它的独立副本将会出现,因此它使用构造函数对每个对象进行初始化。一旦初始化,它的值就不能改变
(5)修饰类成员函数
防止修改非static类成员变量,不会修改对象中的数据成员
class
{
public:
void fun() const //加const修饰
{
a = 10; //出错,不可修改非static变量
b = 10; //对,可以修改
}
private:
int a ;
static int b;
}
(6)修饰对象
当一个对象被声明或使用const关键字创建时,它的数据成员在对象的生命周期中永远不会被改变。
(7)const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用,
如file1.cpp中 const int val;
在file2.cpp中, extern intval; //错误,无法调用,
要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为
extern const int val;
非const变量默认为extern,要是const能被其他文件访问必须显示指定为extern