《C++ Primer Plus》学习笔记——C++中关键词const的用法和作用

C++中关键词const的用法和作用

1、声明常量,可以采用const声明常量。
格式为:
const VarType VarName=value;
如:const int a=10;//const声明的为常量,在使用中不可更改,即
a=20这样的赋值操作不被允许。
2、const也可以用来修饰函数的形参。被修饰的参数在函数中只允许读,不可修改。
格式为:
Int a=10;
void show1(const int a)
{
a=20;//操作不被允许
cout< }
同样的,也可以用来修饰数组
int a[3]={0};
void show2(const int a[],int size)
{
for(int i=0;i cout<<*(a+i)< }
数组元素在函数show2中不允许修改。
3、const修饰指针
const修饰指针的作用很微妙。指针本身就很微妙。如:
int a=10;
const *pt=&a;
这样的意思是pt指向的是一个常量,我们无法通过pt来修改其指向的空间的值(这里是10)。pt指向的是一个常量,但a并不是一个常量,所以这里我们修改a的值是被允许的。如:
a=20;
现在我们来看如下两种情况:
(1)const修饰的值的地址赋值给const修饰的指针
const int a=10;
const int *pt=&a;
(2)const修饰的值的地址付给常规指针
const int a=10;
int *pt=&a;
你可以猜猜看,这两种情况是否被允许。
毫无疑问,(1)是被允许的。我们不能通过a和pt修改该地址的值。
第二种情况是不被允许的,原因很简单,const修饰的目的就是保证值不被修改。如果地址能够被赋值给常规指针,则这状态将不复存在,我们可以通过pt来修改该地址内的值,所以这是不被允许的。
4、假如有这样一个被const修饰的数组。
const int a[5]={1,2,3,4,5};
那么数组名a将不被允许传递给函数的形参。因为C++禁止将常量数组的地址赋值给非常量指针。

注意:我们在程序中应该尽可能地使用const。
原因有两点:
(1)可以避免我们意外修改值导致的程序Bug
(2)使用const使得函数能够处理const和非const实参,否则将只能接受非const实参。
如果条件允许,应该将指针形参声明为指向const的指针
5、区别两种情况
int a=10;
int b=20;
const int *pt=&a;//情况1
int * const qt=&a;//情况2
我们已经了解了情况1,我们可以通过修改a来pt指向的空间的值,但不能通过pt修改。这里指针pt指向的是一个常量,pt并非一个常量,所以我们修改pt的指向也是被允许的如:
pt=&b;
但情况2是指qt是一个常量指针,意思是其指向无法被修改,他只能指向变量a所在空间。但可以修改qt指向的空间。
那么如果我们如果既不想修改pt指针指向的位置,也不想修改其指向的值,则可以这样做:
int a=10;
const int * const pt=&a;
6、const用于类函数
一般来讲,如果你定义了一个类Book,类有一个函数show()。
那么,我们如果申明一个类Book的变量book,
const Book book;
则编译器不允许你使用book.show()。因为它不知道函数show()是否会对book的数据进行修改。
所以在申明和实现函数show时我们需要这么做:
void show() const;
void Book::show() const
{}

你可能感兴趣的:(《C++,Primer,Plus》学习笔记,C++,c++)