C++总结之const限定符
2016-03-10 12:25
246 查看
C++中为防止程序更改我们不希望更改的变量的值,用关键字const对变量的类型加以限定。
例:
结果:编译不通过,提示const对象不允许更改
但是:
结果:编译通过。显示i的结果更改为2。
同样情况下的C++:
结果:编译不通过,因为p的类型是const
int * 而非 int *。
所以,在C语言中通常是用宏,但是在C++中很少会用到宏,C++中主要是用const和inline函数来代替C语言中的宏,学习过C语言的人都知道,C语言中的宏很不容易掌握,经常容易出问题。
C语言中经常用#define来定义常量,与C++中const相比有什么不同?
两者都是定义常量,但是const有更多的优点:
1.const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误;
2.有些集成化的调试工具可以对const常量进行调试,但是不能对宏变量进行调试。
其实区别只在于const是在* 的左边还是在* 的右边。如果const是在* 的左侧,则const是用来修饰指针所指向的变量,即指针指向为常量;如果const是在* 的右侧,则const就是修饰指针本身,即指针本身是常量,因此,情况1和情况2是一种情况。都不允许对其所指向的内容更改。
情况3为指针本身是常量,这种情况不允许对指针本身做修改,但是指针所指向的内容不是常量。
情况4就是指针本身是常量,其所指向的内容也是常量。
另外C++中会经常看到的引用类型,引用的本质其实就是指针,const修饰的情况与指针几乎情况相同,这里不做介绍。
这样用const修饰的成员函数是“只读”成员函数,这个成员函数不允许改变成员变量。一旦在这个成员函数中修改了成员变量的值,编译器会报错。
如果const出现在函数开头,如下所示:
则表示,函数的返回值类型为const int 型。
另外,对于函数传入形参带const修饰符时,可以保护实参不会在函数中被改变。一般这种情况下传入的实参有三种形式:1、实参为const修饰的常量。2、数值。3、临时值,例m+n,m和n为普通变量。
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为普通变量。
相关文章推荐
- 《c语言全局变量的用法》
- Problem B: C语言习题 学生成绩输入和输出
- Problem A: C语言习题 计算该日在本年中是第几天
- C语言试题记录
- C++类复制构造函数参数为nonconst和const的重载
- C/C++获取当前系统时间
- C++上机报告-2
- C++第1次上机作业
- c++第一次实验-4
- C++第一次实验项目3
- c语言学习笔记 指针相关
- C++第一次上机实验报告-2
- C++第一次实验-1
- c++第1次上机实验-3
- c++第1次上机3-2
- C++第一次试验
- C++中智能指针的设计和使用
- C++实验1-两数之和与差
- c++实验报告(2)
- 值得推荐的C/C++框架和库 (真的很强大)