一、const
变量
const
修饰一个变量,代表这个变量是个常量,不可改变:
const int n = 1;
n++; /// error
二、const
与指针
1. 指向常量的指针
const int * p1 = new int(2);
*p1 = 3; /// error
p1 = new int(3);/// works
*p1 = 4; /// error
如上,p1
是一个指针,将其看成是(const int) * p1
,可知其指向的内容是一个常量,所以*p1 = 3
会报错,但是,这个指针可以指向别的变量,不过其指向的内容依然不可变
2. 指针本身是常量
int * const p1 = new int(3);
(*p1)++; /// works
p1 = new int (4); /// error
可以看成是int * (const p1)
,即p1
是个常量,不可改变,但是p1
指向的内容是可变的,所以(*p1)++
能够正常运行
自然,若是const int * const p1 = new int (0)
,则不管是指针本身,还是其指向的变量,都是不可变的。
三、const
与函数参数
-
void func(const int n)
:参数n
是个常量,在函数里面不会被改变 -
void func(const int& n)
:按引用传值,且不会在函数体内被改变,比上一种方式好 -
void func(const int *p)
:指向常量的指针,其指向内容不会被改变 -
void func(int* const p)
:指针本身是常量,本身不会被改变
四、const
与类
1.const
修饰成员变量
class Foo
{
public:
const int n;
const int * p;
Foo(int _n = 0, const int * _p = nullptr) : n(_n), p(_p){};
};
const
修饰成员变量,表示其为常量不可修改,注意其需在初始化列表里初始化
2.const
修饰成员函数
class Foo
{
public:
const int n;
int m = 0;
Foo(int _n = 0) : n(_n){};
void func1()const
{
m++; /// error
cout << n << endl;
func2(); /// error
}
void func2()
{
m++;
}
};
const
作用于成员函数的形式为:void func()const
,其表示不会在函数体内修改任何成员变量,那它怎么保证我们无法修改成员变量呢?,基于下面的规则:
-
const
成员函数内只能调用const
成员变量:非const
成员变量无法被调用,所以修改不了,const
成员变量能够被访问,但是其本身无法被修改 -
const
成员函数不能调用非const
成员函数:非const
成员函数可能修改成员变量,所以禁止调用,而其他const
函数因为不会改变成员变量,所以可以调用,“保证了纯正的血统” : P
3. const
修饰对象
const Foo foo;
foo.m ++; /// error
cout << foo.m << endl; /// works
foo.func1(); /// works
foo.func2(); /// error
const
修改对象,表示这个对象是个常量,里面的数据不能被修改,其限制基于下面规则:
- 公有变量只可读,不可写
- 该对象只能调用
const
成员函数
而const
修饰对象指针也是同样的道理:
const Foo * p1 = new Foo();
p1->m++; /// error
cout << p1->m << endl; /// works
p1->func1(); /// works
p1->func2(); /// error
网友评论