C++里的const变量、const函数、const指针、const数组等

57 篇文章 1 订阅
11 篇文章 1 订阅

    在C++语言中,有时候需要使用常量,这里的常量是指广义的常量,包括const变量、const函数、const指针、const数组等等。常量,具有只读属性,即一旦已经初始化,就只可读取,无法修改,类似于只读光盘一样,值已经写进常量区,只可读取,无法二次写入。

1 const常量

    const常量,可以是一个整形常量,比如,const int a = 3; 表示a是一个等于3的整形常量,a的值是只读的。

const int    a  = 3;    //整型常量
const float  pi = 3.14  //圆周率pi,单精度常量
const double e  = 2.718 //自然对数e,双精度常量
  • 圆周率pi =3.1415926535897932384626…, 它一个无理数,即无限循环小数,常用三角函数、弧度/角度之间的换算,通常取小数点后2位,即pi≈3.14,可以把pi定义为const,表示不可修改。
  • 自然常数e=2.71828182845904523536…,它也是一个无理数,常用于复利计算、求导等,通常取3位,即e≈2.718,把它定义为const,也是合理的。

2 const函数

    const函数,若它在类中,表示常函数,不能修改类的成员变量。常函数主要用于获取类的属性、特定计算。比如,一个矩形类Shap定义如下:

class Shape
{
public:
    Shape(int x,int y)
      :m_x(x)
      ,m_y(y)
    {

    }

    int GetArea() const  //获取面积
    {
        return m_x * m_y;
    }

    int GetX() const //获取x
    {
        return m_x;
    }

    int GetY() const //获取y
    {
        return m_y;
    }

private:
    int m_x;
    int m_y;
};

    int GetArea() const 表示获取矩形的面积,x是宽度,y是高度,那么矩形面积就是 x*y。由于面积不涉及对宽度、高度的修改,只是读取宽度、高度这些属性,所以将GetArea()函数用const修饰,是合理的。

3 const指针与const value

    当const 与*一起修饰变量时,有如下3种情况:

组合pointervalue说明
const int* pNum1地址可变值不可变const修饰的是value
int* const pNum2地址不可变值可变const修饰的是pointer
const int* const pNum3地址不可变值也不可变前一个const Type*,是修饰value;后一个const p是修饰指针
  • 对pointer来说,可变,是指pointer的指向,可以从指向A地址,改成指向B地址;
  • 对value来说,可变,是指value的值,可以更新,比如从10,更新到30;

3.1 const int* pNum1

    const int* pNum1,表示地址可变,值不可变,如下:

    int numA = 10;
    const  int*      pNum1 = &numA; //value是const的,pointer不是const

	//1) value是const的,pointer不是const
    *pNum1 = 20; //编译报错,因为value = *pNum1是const的,不能修改值

    int numB = 50;
    pNum1 = &numB; //正常,因为pNum1不是const,可以改变指向,从指向numA,改成指向numB;

    pNum1是一个pointer,而*pNum1是一个value,通过语句const int* pNum1 = #,可知: pNum1是一个普通指针,可以改变指向 ;而value = *pNum1是一个常量,不可以修改。

3.2 int* const pNum2

    int* const pNum2 表示值可变,地址不可变,如下:

    int numA = 10;
    int*   const     pNum2 = &numA; //pointer是const的,value不是cosnt
    //2) pointer是const的,value不是cosnt
    int numC = 60;
    pNum2 = &numC; //编译报错,因为pNum2 = pointer,是const,不能修改地址;

    *pNum2 = 70;   //正常,因为*pNum2 = value,不是const,可以更新值,从10更新到70

    pNum2是一个pointer,而*pNum2是一个value,通过语句int* const pNum2 = &numA; ,可知:
pNum2一个常量指针,不可以修改指向 ;而value = *pNum2是一个变量,可以更新值。

3.3 const int* const pNum3

    const int* const pNum3 表示地址不可修改,值也不可以修改,如下:

    int numA = 10;
    const  int* const pNum3 = &numA; //value是cost的,pointer也是const
	
	//3)value是cost的,pointer也是const
    int numD = 80;
    pNum3 = &numD; //编译报错,因为pNum3 = pointer,是const,不能修改地址;
    *pNum3 = 90;   //编译报错,因为*pNum3 = value,也是const,不能更新值

    pNum3是一个pointer,而*pNum3是一个value,通过语句const int* const pNum3 = &numA;,可知: pNum3是一个常量指针,不可以修改指向;同时,*pNum3也是一个常量,不能更新值。

4 const数组

    当需要把一些固定的元素或者字段,放在一起时,既可以使用枚举,也可以使用const数组。比如,把三原色:red、green、blue,放在一起,形成一个常量数组arry[3]。

const std::string arry[3] = {"red","green","blue"}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值