const在c与c++中的不同地位

来源:互联网 发布:打死不看右下角软件 编辑:程序博客网 时间:2024/05/19 22:05

我们都知道,const关键字是防止某个变量被修改的,即限定这个变量是只读的。C/C++中应用const会使程序的健壮性更高一些。


一、const修饰一般变量

在C中,const修饰一般变量是常变量,它具有变量属性,但同时,它又具有常性不可被修改。

在C++中,加const修饰以后变量就是个常量,不可被修改。


二、const修饰指针变量

先回想一下我们以前在C中写一段代码时传参的方式有传值和传址两种,但是大家也都知道传值的方式就是在函数内部做了一份临时拷贝,但出了这个函数的作用域临时变量就会被销毁。而利用指针传址的方式又不安全,例如下面这段代码:

//传址方式-----不安全void print2(int *pa){*pa = 20;   //a的值会发生改变cout<<*pa<<endl; //输出为20}int main(){int a = 10;print2(&a);system("pause");return 0;}


这样,即便是一个简单的输出函数也会变得不安全,因此我们会加const使其变为安全的:

void print2(const int *pa)//注意这块的const一定在*左边而不是在*右边,*放在右边修饰的是a,说明这个a是不能被修改的{cout<<*pa<<endl; }


在c/c++中,const修饰指针变量时需要考虑const的位置:

这时就应该弄清楚一个概念:指针常量和常量指针

(1)常量指针:中心词是指针,用常量来修饰指针,其本质是一个指针,说明这个指针是一个指向常量的指针,即指针本身是可以修改的,但指针指向的变量不可修改

(2)指针常量:中心词是常量,用指针修饰,本质是一个常量,说明这个常量的值应该是一个指针,即指针本身的值是不能改变的,而通过指针指向的变量的值是可以改变的

int a = 1;int b = 3;const int *p = &a;//常量指针int const *p = &a;//常量指针int* const p = &a;//指针常量


C++中的const引用:

1.引用一个常量时,必须用const修饰——常量不可被修改

#include<iostream>#include<cstdlib>   //在.cpp文件中使用.h头文件时,前边加上c并去掉.husing namespace std;int main(){const int &refn = 5;return 0;}


2.const修饰一个变量时:(先看一段错误代码)

int main(){const int n = 10;int &refn = n;return 0;}

refn作为n的引用,二者用的是同一个空间,按理来说,这一块空间只具有一个安全属性,要么是安全的要么是不安全的。但是从上边代码来看,n加了const保护不可被修改,但refn不具有安全属性,即它所代表的空间内容可被修改,这样就产生了矛盾。因此,要想refn称为n的引用,这里必须加上const保护。即:const int& refn = n;


3.const修饰一个引用时可以对该变量加以保护

int main(){int a = 0;const int &refa = a;refa = 10;   //欲通过refa来改变a的值,system("pause");return 0 ;}
引用加了const保护从而使a的这块空间不会被改变,增加了其安全属性。因此我们也可以将引用作为参数(由于不需要拷贝一份临时变量,效率会高一些):

//引用传参void print3(const int &refa){cout<<refa<<endl;}int main(){int a = 10;print3(a);system("pause");return 0;}


4.const修饰全局变量,不一定会为其开辟空间。


const修饰全局变量,不一定会为其开辟空间。如果不对n进行直接的操作,那么n这块空间是还没被开辟的,这时候const的作用和#define一样,在程序中仅仅只是替换n。只有在需要使用n所属的空间时系统才会开辟一块空间出来,因此,上边代码中的&n操作就会出现错误。(和底下这段代码作比较)


这段代码中需要用p指针指向n的这块空间的地址,编译器为其开辟了空间


5.引用的类型与已定义的变量类型不同

//这段代码是错误的

int main(){double d1 = 1.2;int &d2 = d1;system("pause");return 0 ;}

//这段代码在编译时只产生警告

int main(){double d1 = 1.2;const int &refd2 = d1;system("pause");return 0 ;}

从上边两端代码看得出,仅仅只有一个const之差,那么为什么会产生这样的差异呢?!我们接下来分析一下:


通过调试我们可以发现,d1和d2用的并不是同一块空间,说明d2根本就不是d1的引用。在这里其实是有一些变化的,当int类型的d2要作为double类型的d1的引用时,由于两者类型不同,会根据d1产生一个int类型的临时变量(匿名变量),而d2是这个临时变量的引用。临时变量一般是不能被修改的,因此在这里加了const。

因此,以后在变量与该变量的引用之间有类型变化时一定要加const修饰

0 0
原创粉丝点击