C++ Const(常类型)的作用总结


C++ Const的作用总结

面试或者工作中,我们经常遇到const修饰符定义的变量,函数和对象等。那么const的作用具体是什么,有哪些。今天自己好好的总结了一下,记录下来方便自己以后时间久了不记得,可以回头看一下。

在C中,我们都是习惯用#define来定义常量,C++中提供了const修饰符来定义常量,这种方式更灵活,更安全。主要表现在define常量是没有类型定义的,const常量是类型化的,它有地址,可以用指针指向这个值,但是不能修改它。

Const的使用

  • 和指针一起使用

Const可以和指针一起使用,它们的组合情况比较复杂,可归纳为三种:指向常量的指针,常指针和指向常量的常指针。

(1) 指向常量的指针是指一个指向常量的指针变量,例如:

const char* info = “name”;          // 声明指向常量的指针

这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型的常量,初始化为info指向字符串“name”。

所以下面的一句是错误的:info [3] = ‘b’;

因为这里指针所指的数据(name)是常量,不能通过解引用来修改该数据。

然后下面这句话是允许的:info = “sex”;

因为指针本身是变量,可以指向其他的内存单元。

(2) 常指针是指把指针本身,而不是它指向的对象声明为常量,例如:

char * const info = “name”;         // 常指针

这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型数据的常指针,初始化为“name”的地址。常指针就是创建一个不能移动的固定指针(地址不能改变),但是它所指的数据是可以改变的。

所以下面的一句是错误的:info = “sex”;

因为指针本身是常量,不能指向其他的内存单元。

然后下面这句话是允许的:info [3] = ‘b’;

因为指针所指向的数据是可以通过解引用来修改的。

(3) 指向常量的常指针是指这个指针本身不能改变,它所指向的值也不能改变,声明一个指向常量的常指针,二者都要声明为const,例如:

const char * const info = “name”;

这里就是上面两种的结合了,info = “sex”和info [3] = ‘b’都是错误的。

其他说明:

  a. 常量一旦建立,在程序的任何地方都不能在修改。

  b. 与#define定义的常量不同,const定义的常量因为有自己的数据类型,这样C++编译时就会进行严格的类型检查,具有良好的编译时的检测性。

  c. 函数的参数也可以用const说明,用于保证实参在该函数内部不被改动。

  • 常引用

如果在声明引用是用const修饰,那么该引用就被称为常引用。常引用所引用的对象不能被更新。如果用常引用做为形参,便不会产生对实参不希望的修改。

定义:const 数据类型 &引用名;

如: int a = 5;

     const int &b = a;

其中,b是一个常引用,它所引用的对象不允许更改,如果出现:

b=6;

则是非法的。(如果你写a=6,这个不会出问题,因为a不是常类型变量。)

常引用常常被用作形参,例如:

void main()
{
    int a = 10;
    int b = 20;
    add(a, b);
}

int add(cons int &a, const int &b)
{
    // a += 10;         // 非法的,形参a为常引用,不能改变它的值
    return (a + b);
}
  • 常对象

如果在声明对象的时候用const修饰,则称被声明的对象为常对象。常对象的数据成员值在对象的整个生命周期内不能被改变。

定义:类名 const 对象名[(参数表)]或者const 类名 对象名[(参数表)]

在定义对象时必须进行初始化,而且不能被更新,C++不允许直接或间接的更改常对象的数据成员。

  • 常对象成员

(1) 常数据成员

类的数据成员可以是常量或常引用,使用const说明的数据成员称为常数据成员。如果在一个类中声明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他的函数都不能对该成员函数赋值。

(2) 常成员函数

在类中使用关键字const的函数称为常成员函数,常成员函数的格式如下:

返回类型 函数名(参数表)const;

const是函数类型的组成部分,所以在函数的实现部分也要带关键字const。

如:

void showDate() const;       // 声明
void showDate() const       // 实现
{
    printf(“year”);
}

说明:

  a. 如果将一个对象声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用普通的成员函数。常成员函数是常对象的唯一的对外接口。

  b. 常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,这就保证了在常成员函数中绝对不会更新数据成员的值。