【C/C++】const详解,拿捏住了

目录

嗨,这里是狐狸~~

const

用法1:常量

用法2:指针和常量

用法3:const修饰函数传入参数

用法4:修饰函数返回值

用法5:const修饰成员函数(c++特性)

具体展开来讲:

(一). 常量与指针

(二):常量与引用

(三):常量函数

(四):常量返回值

c++ 中const 

1. const常量

2.  const 修饰类的数据成员

3. const修饰指针的情况

4. const的初始化

5. 另外const 的一些强大的功能在于它在函数声明中的应用

6.     类成员函数中const的使用 

7. 使用const的一些建议

const 在c和c++中的区别  

总结


人生如梦,岁月如水,静好无恙。

嗨,这里是狐狸~~

时间不多,废话少说,我们直接开始。今天讲const。

const

        为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下:

  常变量:  const 类型说明符 变量名

  常引用:  const 类型说明符 &引用名

  常对象:  类名 const 对象名

  常成员函数:  类名::fun(形参) const

  常数组:  类型说明符 const 数组名[大小]    

  常指针:  const 类型说明符* 指针名 ,类型说明符* const 指针名

       首先提示的是:在常变量(const 类型说明符 变量名)、常引用(const 类型说明符 &引用名)、常对象(类名 const 对象名)、 常数组(类型说明符 const 数组名[大小]), const” 与 “类型说明符”或“类名”(其实类名是一种自定义的类型说明符) 的位置可以互换。如:

     const int a=5; 与 int const a=5; 等同

     类名 const 对象名 与 const 类名 对象名 等同

用法1:常量

         取代了C中的宏定义,声明时必须进行初始化(!c++类中则不然)。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。―《C++ Program Language》用const声明的变量虽然增加了分配空间,但是可以保证类型安全。

           C标准中,const定义的常量是全局的,C++中视声明位置而定。

用法2:指针和常量

       使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。

       所以出现在 * 之前的const是作为基础类型的一部分:

char *const cp; //到char的const指针

char const *pc1; //到const char的指针

const char *pc2; //到const char的指针(后两个声明是等同的)

 从右向左读的记忆方式:

cp is a const pointer to char. 故pc不能指向别的字符串,但可以修改其指向的字符串的内容

pc2 is a pointer to const char. 故*pc2的内容不可以改变,但pc2可以指向别的字符串

且注意:允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋                  给一个普通的、非 const 对象的指针。

用法3:const修饰函数传入参数

        将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
    通常修饰指针参数和引用参数:

void Fun( const A *in); //修饰指针型传入参数

void Fun(const A &in); //修饰引用型传入参数

用法4:修饰函数返回值

        可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。

用法5:const修饰成员函数(c++特性)

       const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;

const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;

const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。

具体展开来讲:

(一). 常量与指针

       常量与指针放在一起很容易让人迷糊。对于常量指针和指针常量也不是所有的学习C/C++的人都能说清除。例如:

    const int *m1 = new int(10);

    int* const m2 = new int(20);

        在上面的两个表达式中,最容易让人迷惑的是const到底是修饰指针还是指针指向的内存区域?其实,只要知道:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用。根据这个规则来判断,m1应该是常量指针(即,不能通过m1来修改它所指向的内容。);而m2应该是指针常量(即,不能让m2指向其他的内存模块)。由此可见:

    1. 对于常量指针,不能通过该指针来改变所指的内容。即,下面的操作是错误的:

      int i = 10;

      const int *pi = &i;

      *pi = 100;

      因为你在试图通过pi改变它所指向的内容。但是,并不是说该内存块中的内容不能被修改。我们仍然可以通过其他方式去修改其中的值。例如:

      // 1: 通过i直接修改。

      i = 100;

      // 2: 使用另外一个指针来修改。

      int *p = (int*)pi;

      *p = 100;

        实际上,在将程序载入内存的时候,会有专门的一块内存区域来存放常量。但是,上面的i本身不是常量,是存放在栈或者堆中的。我们仍然可以修改它的值。而pi不能修改指向的值应该说是编译器的一个限制。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值