您的位置:首页 > 编程语言 > C语言/C++

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

2016-07-01 00:04 225 查看
我们都知道,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并去掉.h
using 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修饰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  const c与c++