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.2、const指针
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.4、typedef 和指针
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>