zoukankan      html  css  js  c++  java
  • 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所不能完成的。

  • 相关阅读:
    最短路径问题大总结(提纲)
    单源最短路——Bellman-Ford算法
    多源最短路——Floyd算法
    Bracket Sequences Concatenation Problem括号序列拼接问题(栈+map+思维)
    数位DP
    C++ string中的find()函数
    Planning The Expedition(暴力枚举+map迭代器)
    8月5号团队赛补题
    8月3号水题走一波-个人赛五
    Walking Between Houses(贪心+思维)
  • 原文地址:https://www.cnblogs.com/fate-/p/12616124.html
Copyright © 2011-2022 走看看