C++的关键字const详解

C++的关键字const详解

const为常量限定符,用来限定特定变量,告诉编译器该变量只读。习惯性使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。本文主要从四个方面来讨论const:(1)const修饰基本数据类型;(2)const在函数中的应用;(3)const在类中的应用;(4)const修饰类对象,定义常量对象。

一、const修饰基本数据类型

1、const修饰一般常量及数组

const int a=10;            <=>(等价)  int const a=10;
const int arr[3]={1,2,3};  <=>(等价)  int const arr[3]={1,2,3}; 

对于类似的基本数据类型,const表明这些变量是常量,在后面的操作不能改变这些常量值。

2、const修饰指针变量*及引用变量&

指针:用来指向实际内存地址的变量,一般指针是无符号整型。
引用:相应变量的别名,用于向函数提供直接访问参数的途径,与指针相比,引用是一种受限制的指针类型,或者说是指针的一个子集,是指针功能的一种高层表现。
PS:在声明变量的时候:&来声明左值引用变量,*来声明指针变量。
作为操作符的时候:&为取地址符,是解引用符(取出指针所指向的内存的值)。
const修饰指针(
):

const int *a = &[1];  //常量数据的变量指针,指针是变量
int const *a = &[2];  //常量数据的变量指针,与[1]相同
int* const a = &[3];  //变量数据的常量指针
const int* const a = &[4];  //常量数据的常量指针

PS:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量;[1]、[2]情况相同,都是指针指向的内容为常量,这种情况写不允许对内容更改,但是可以更改指针,比如可以a++,但是不能a=3;
如果const位于星号的右侧,则const就是用来修饰指针本身,[3]的指针本身为常量,而指针所指向的内容不是常量,所以a=3是可以,而a++则会报错。
const修饰引用:

int const &a = x;
const int &a = x;
int &const a = x;//这种方式C与C++编译器未定义,虽然不会报错,等价于int &a

这两种定义方式是等价的,此时的引用a不能被更改。如:a++这是错误的。

二、const应用到函数中

主要有两个方面的应用:(1)作为参数的const修饰符;(2)作为函数返回值的const修饰符。

1、修饰参数的const

void fun0(const A* a);
void fun1(const A& a);

调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对指针传递进来的内容进行更改,保护了指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行更改,保护了原对象的属性。
PS: 参数const通常用于参数为指针或者引用的情况。

2、修饰返回值的const,如const A funs(); const A* fun3();

const按照修饰原则对返回值进行修饰,起到保护作用。

//例子:
const Rational operator*(const Rational& lhs , const Rational& rhs){
    return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator() * rhs.denominator() );
}
//如果出现下面这种情况,编译器则会报错
Rational a,b;
Rational c;
(c*b)=c;//error

3、类中的成员函数:A fun4() const;

其意义上是不能修改所在类的任何变量。

三、类中定义常量(const的特殊用法)

在类中定义常量的定义大致有这么几种方式实现:

1、使用枚举类型

class test{
  enum{ size1 = 10, size2 = 20};//枚举常量
  int array1[SIZE1];
  int array2[SIZE2];
};

2、使用const

PS: 不能在类声明中初始化const数据成员,因为类的对象还未被分配内存,编译器不知道const数据成员是什么。正确方式:const数据成员的初始化只能在类构造函数的初始化表中进行。

Class A{
   A(int size);//构造函数
   Const int size;
};
A::A(int x):size(x){}
//error赋值方式是不行的
A::A(int x){
   size = x;
}

PS:对const成员变量的初始化,不能在变量声明的地方,必须在类的构造函数的初始化列表中完成,即使在构造函数内部赋值也是不行的。具体原因搜索【初始化列表和赋值的区别】

3、使用static const

通过结合静态变量来实现const常量的赋值:

class A{
public:
  static int const Inity;};
int const A::Inity = 1997;//静态变量的赋值方法,注意必须放在类外定义

四、const定义常量对象,以及常量对象的用法

class test{
public:
  test(){}
  ~test(){}
  void set(){}
  int get() const{}};
void main(){
  const test t;//定义常量对象
  t.set();//error
  t.get();
}

常量对象只能调用常量函数,别的成员函数都不能调用。

五、使用const建议

1、在搞懂const的用法的前提下,尽可能的使用const;
2、const变量赋值是错误的!!!
3、参数使用const应该用在引用或者指针上,而不是一般的对象实例上;
4、const在成员函数中的三种用法(参数、返回值、函数);
5、不要轻易将返回值设为const,除非是重载操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值