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

C++总结之const限定符

2016-03-10 12:25 246 查看
C++中为防止程序更改我们不希望更改的变量的值,用关键字const对变量的类型加以限定。

C语言中const和C++中const的区别:

C语言中const表示的意思是只读,即不允许改变其值,但是并没有要求不能通过改变他的地址所指向的内容来改变其值,C++对这一缺陷进行了一定的修改,即通过其地址也无法改变其值。

例:

include<stdio.h>
int main(){
const int i=1;
int* p=&i;
printf("%d\n",*p);
i=2;
printf("%d",i);
return 0;
}


结果:编译不通过,提示const对象不允许更改

但是:

#include<stdio.h>
int main(){
const int i=1;
int* p=&i;
printf("%d\n",*p);
*p=2;
printf("%d",i);
return 0;
}


结果:编译通过。显示i的结果更改为2。

同样情况下的C++:

#include<iostream>
using namespace std;
int main(){
const int i=1;
int * p=&i;
cout<<*p<<endl;
*p=2;
cout<<i<<endl;
return 0;
}


结果:编译不通过,因为p的类型是const
int * 而非 int *。

所以,在C语言中通常是用宏,但是在C++中很少会用到宏,C++中主要是用const和inline函数来代替C语言中的宏,学习过C语言的人都知道,C语言中的宏很不容易掌握,经常容易出问题。

C语言中经常用#define来定义常量,与C++中const相比有什么不同?

两者都是定义常量,但是const有更多的优点:

1.const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误;

2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏变量进行调试。

const修饰指针

下面介绍一下初学者经常会弄混淆的,const修饰指针的情况,一般有一下4种情况:

int b=100;
const int* a=&b;  //情况1
int const *a=&b;   //情况2
int* const a=&b;   //情况3
const int* const a=&b;   //情况4


其实区别只在于const是在* 的左边还是在* 的右边。如果const是在* 的左侧,则const是用来修饰指针所指向的变量,即指针指向为常量;如果const是在* 的右侧,则const就是修饰指针本身,即指针本身是常量,因此,情况1和情况2是一种情况。都不允许对其所指向的内容更改。

情况3为指针本身是常量,这种情况不允许对指针本身做修改,但是指针所指向的内容不是常量。

情况4就是指针本身是常量,其所指向的内容也是常量。

另外C++中会经常看到的引用类型,引用的本质其实就是指针,const修饰的情况与指针几乎情况相同,这里不做介绍。

const成员函数

在C++中我们经常会在类的成员函数声明时,碰到这种形式:

class ABC{
int a;
int* p;
public:
ABC(int data,int *q):a(data),p(q){}  /*关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把它看成一个不同的函数 */
void print()const  {    cout<<a<<endl;  }
};


这样用const修饰的成员函数是“只读”成员函数,这个成员函数不允许改变成员变量。一旦在这个成员函数中修改了成员变量的值,编译器会报错。

如果const出现在函数开头,如下所示:

const int insert(const int a){
...
}


则表示,函数的返回值类型为const int 型。

另外,对于函数传入形参带const修饰符时,可以保护实参不会在函数中被改变。一般这种情况下传入的实参有三种形式:1、实参为const修饰的常量。2、数值。3、临时值,例m+n,m和n为普通变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: