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

来源:互联网 发布:傻瓜视频制作软件 编辑:程序博客网 时间:2024/05/21 14:00

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 为constvector<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