const常量

1 常量的概述

为什么使用const  

  *代码更容易维护

  *确保一些不变量不会被误修改

常量分类

  *常变量、常饮用、常对象、常数组、常指针

常量的定义

  *类型  const  变量名=初始化表达式

  *表明定义一个特定类型的变量,且其值不可变

  *也可以写为:const  类型  变量名=初始化表达式

2  常变量的定义与使用

定义:const  类型说明符  变量名

  *含义:所定义的变量是常量,不可修改

  *注意:由于常量定义后不可修改,所以在定义时需要初始化

例如:

  const  int  N=10;//定义一个整数常量N

  int const M=100;//定义一个整数常量M

  float const d=3.9;//定义一个浮点数常量d

  N=11;//该语句不正确,因为N为常量不可修改

  const  double  pi;//无初始化,该定义无意义,且编译无法通过

3  常引用的定义及使用

定义:const  类型说明符  &变量名=初始化

  定义时需要对其值进行初始化

  该定义表明:不可通过所定义常变量修改值

例如:

  int N=10;//定义一个普通变量N

  const int  &M=N;//定义常引用M,初始化为N

  M=100;//通过M不可修改,所以编译无法通过

  N=100;//通过N可以修改

作用:保护变量值,避免被修改

4 常对象

在对象部分再说

5  常指针的定义及使用

定义:

  形式1:(指针指向的元素值不可变)

  const  类型说明符* 指针名=初始化表达式

  等价于:

  类型说明符  const  *  指针名  =初始化表达式

例如1:

  int  n=10;

  int  const *p=&n;//定义一个常指针,指向N变量

  *p=11;//不可修改

例如2:

  int  n=10;

  const  int  *  p=&n//等同于int  const  *  p=&n;

  *p=11;//不可修改

例如3:

  const  int  n=10;

  const  int *  p1=&n;

  int  *  p2  =&n;//不可让非常指针指向常变量

  *p2=11;//避免对值的误修改

定义:

  形式2:(指针指向不可变)

  类型说明符*const  指针名=初始化表达式;

例如:

  int n=10,m=20;

  int  *  const  p=&n;//定义常指针,其指向不可变

  *p=11//指向的值可变

  p=&m//指向不可变

6  常数组的定义及使用

定义:const  类型名  数组名[维数]=初始化表达式

  含义:所定义的数组是常数组,数组元素值不可修改

  注意:在定义时需要初始化

  注意:即使通过指针,也不可改变数组元素值

例如:

  const  int  N=3;

  const  int  arr[N]={1,2,3}  //定义常数组arr,并初始化

  arr[0]=6;//不可修改数组元素值

  int  *p=arr;//不可复制给指针p

  int  const  *p=arr;//或者 const  int *p=arr;

7  const  在函数中的应用

应用1:在函数的形参中利用const修饰

定义:类型  函数名(const  类型  形参1,。。。);

效果:使函数中被const修饰的形参值不会被修改;

例如1:

  void  fune  (const  T  a);//对于非指针类型,没必要

  void  func(const  T  &a);//确保值不会被误改,同时引用方式可以提高函数执行效率

  void  func(const  T  *a);//确保指针指向的值不会被修改

例如2:

void  funb(int a1,int &b1,int * &c1,const int a2,const int &b2,const int *c2)

{

  a1++;b1++;*c1=*c1+1//可以修改

  a2++;b2++;*c2=*c2+1;//均不可修改,编译无法通过

}

例如3:(常指针的应用)

void fun2(const char* s){//确保s指向的数据不会被修改
    cout<<s<<endl;
    s[0]='';//对指向数据修改引发编译错误
    s=nullptr;//但是s指针指向可以修改
}

7  const在函数中的应用

应用1:利用const修饰函数参数:

  const修饰常与引用传递一起使用

  对于非内部数据类型的输入参数,“cosnt引用传递”比“值传递”更高效,且能控制数据不会被修改。

  对于基本数据类型一般不用引用传递,除非有明确的目的,例如利用其返回值

  如果参数作输出用,不论其类型,都不能加const修饰,否则该参数将失去输出功能

应用2:利用const修饰函数的返回值

  定义:const  类型  函数名(函数参数列表)

  效果:使函数的返回值不被修改,接受返回值的变量也需要是常量;

例如1:

const char *getstring(,,,)//函数的定义
char *str=getstring(,,,)//出现编译错误
const char *str=getstring(,,,);//正确

例如2:

const int getint(,,,)//函数的定义
int i=getint(,,,)//编译正确
const  int j=getint(,,,);//正确
为什么???  与例一的区别在哪里??


因为int i=getint(,,,)运行后,返回的值分变成了两份
一份在i,一份在函数里,这时候,i不用const接受也没问题,
因为无论i怎么变,函数里的返回值都不变

  

8  c和c++中常量的区别

c++中:const正常情况下是看成编译器的常量,编译器并不为const分配空间,只是在编译的时候将其值保存在名字表中,并在适当的时候折合在代码中

c中:const是一个不能被改变的普通常量,编译器不知道编译时的值。

例如:

  const int N=10;
  int arr[N];//c中不正确,c++中正确

9  cosnt 和#define

区别:

  c++中定义常量的时候不建议采用define,因为define只做简单的宏替换,并不提供类型检查

是否const可以替换#define

  否,#define中还有许多其他功能是const所不能完成的。

原文地址:https://www.cnblogs.com/fate-/p/12616124.html