C/C++ 语法高阶:const应用专题

1、在C语言中const对象并不是真正的常量,在使用的过程中可以修改该对象的值。

      定义一个const对象,然后将一个指针指向该对象。并且我们可以通过指针修改该对象的值。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int num =12;
    int *p = #
    printf("%s%d\n","const int num =",num);
    printf("%s%d\n","*p=",*p);

    *p = 14;
     printf("%s%d\n","const int num =",num);
    printf("%s%d\n","*p=",*p);
    return 0;
}
      程序运行的结果如下所示:

       通过指针来修改const对象的值在C语言里面是成立的,也就是说C里面的const并不是真正意义上的const,给变量或是对象加上const是告诉使用者在使用的过程中要保持该变量不变,而不是保证该变量不变。

2、C++中const 的使用呈现出遍地开花的现象,确实如此,使用const可以提高程序的可读性和可维护性。

       在C++中我们可以使用const声明的全局变量来代替  预处理器定义的全局变量
        
#define NUM 12
//我们同样可以这样定义一个全局变量
const int NUM = 12;
       使用const定义的全局变量比使用预处理器定义的要好,因为预处理器定义的变量并没有在变量表中,在程序运行的过程中,编译器会把遇到的NUM全部替换为12,而这对我们在阅读程序,跟踪程序源码的时候是很不方便的。
       正是因为const在C++中是真正的const,所以我们可以使用const定义的整型对象来定义数组:
const int num = 12;
int  Array[num];

3、const 引用:

       const int  &data = num;
     有关const引用的应用,如果还有不熟悉的可以参看: const 引用       

4、指针和const限定符:

      4.1、指向const对象的指针

       指向const对象的指针必须具有const特性

<span style="font-size: 10.5pt;">  </span><span style="font-size:10px;">const int iVal =42;
  const int *pVal = &iVal;//OK
  int *pVal2= &iVal;//Error,指向const对象的指针没有const属性</span>


      当然,指向const的指针也可以指向非const对象,这种用法主要用于函数的形参中,避免函数内部对参数的修改。

      int iVal =42;

      const  int *pVal =&iVal;//此时不能通过对指针进行间接访问操作来修改iVal的值

     4.2const指针

       const指针即本身的值不能被修改,但是可以使用指针来修改其所指对象的值  

int num =10;
int *const pNum =#
*pNum = 12;//此时num = 12

   此时pNum 是指向int型对象的const指针,pNum 的值不能修改,这就意味着不能使用pNum指向其他的对象。

    4.3、指向const对象的const指针

const double pi = 3.141592653589793 ;
const double *const db_Ptr = π

   此时既不能修改pi的值,也不能修改db_Ptr所指向的对象。

    4.4typedef 和指针

typedef string *pstring;
const pstring m_str;//注意,此时const限定的是pstring 类型,这是一个指针。因此该声明语句是把m_str定义为指向string类型对象的const指针                     //,这个定义等价于:
string *const m_str;

     4.5、const和迭代器

vector<int> vec;//定义一个容器对象
const vector<int>::iterator iter = vec.begin();//定义一个迭代器,此时不能指向新的对象
++iter;//错误,因为iter 为const
vector<int>::const_iterator const_iter = vec.begin();//此时不能修改迭代器所指向的对象
++const_iter;
*const_iter = 100;//错误
     这是因为迭代器是用指针来定义的,所以迭代器的作用就相当于T*指针。声明迭代器为const 就相当于将T*声明为const。就如同4.4中的类型一样,将指针声明为const类型的指针。

 5、函数和const限定符

        5.1、形参加const限定符

<span style="font-size:10px;">int GetData(const int &);</span>

       5.2、成员函数加const限定

<span style="font-size:10px;">int display(const &t1) const ;</span>

   注意,这里函数的const是表明函数内部不允许对类的数据成员进行修改的。通常这种声明用于类的函数成员(成员函数)

       5.3、函数返回const类型

<span style="font-size:10px;">const int Getdata(int data); //返回一个const类型
const int &GetData();   //返回一个const引用
const int*pFunc(int num);//返回一个const 指针</span>

       5.4、指向函数指针的引用

<span style="font-size:10px;">int (*Func)(int,int);//声明一个函数指针
int  GetTheData(int,int);//声明一个函数
Func = GetTheData;
int (*const &refFunc)(int,int)(Func);//此时const引用refFunc指向Func,不能通过refFunc来修改函数Func的指向</span>

6、在C++中有关const的应用主要体现在类之中,下一节会详细讲解,这里是要让大家初步认识到const的性质以及其强大的功能




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值