const 在c及c++中应用
Posted xqy-888
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const 在c及c++中应用相关的知识,希望对你有一定的参考价值。
const 在c及c++中应用
const的定义:const是ANSI C中的的关键字,它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性,const在其它编程语言中也有出现,例如Pascal、C++、php5、BC#等。
一.const在c和c++中的基础用法
const 用于定义变量,当int const a=10;时此时变量a只有只读权利。这时a为只读,就不能为左值,即不能被赋值。
?? 注意此时const int a=10;与int const a=10;语义相同。const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。#include<iostream>
using namespace std;
const int a=10;
int main()
?int b=a; //不为左值 合法
?a=100 //为左值 非法
- 在c语言某些编译器(例如vc++6.0)中用const变量来初始化数组,编译器会报错。这是由于“只读变量”和“常量”的不同。但注意在C++中则可以,因为const被扩展了含义。
?? 但由enum类型和#define宏定义的数就可以用来定义常量初始换数组。
二.const和#define的区别
?? 他们两个从功能上说它们很像,但它们又有不同。
define是预编译指令,而const是普通变量的定义。const定义的是变量,而#define定义的是常量。#define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。例如刚刚的初始化数组,用#define就能够运行。
因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是开辟一个新内存来存放它的值,只不过这个值由编译器限定不允许被修改。而ANSI C规定数组定义时长度必须是“常量”,所以会报错。
但其实除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用const。
三.const与一维指针的运用
const int p1=&a;等价于int const p1=&a;
const int p1=&a; ?//const修饰p1,将p1作为左值合法,将p1作为左值非法
我们可以看出,const修饰的是p1,不能直接改变 *p1的值,但可以改变指向来改变p1的值。
- int * const p2=&a; ?//const修饰p2,将p2作为左值非法,将p2作为左值合法
这种情况下,const修饰的是p2,不能直接改变p2的方向,但可以改变p2的值。
- const int const p3=&a;?//const分别修饰p3,p3,将p3,p2作为左值都非法,这时p3的值和p3方向都不能被改变
我们可以看出,const修饰的是p1,不能直接改变 p1的值,但可以改变指向来改变p1的值。
??总结:const后面是什么,什么就不能被修改。Eg.const int p1=&a; 和const int p2=&a; 分别为*p1的值和p2指向不能改变。
四.const在与函数
??const更大的作用是它可以修饰函数的参数、返回值,甚至函数的定义体。但需要注意的是如果参数做输出需要,用const就失去了功能。
- 例如:
void StringCopy(char*strDestination, const char *strSource);
?其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。
- 传递地址时加const修饰,函数返回值只能被赋给加const修饰的同类型指针,或者使用强制转换。
const int* func(void) //函数声明
?int* a = func(); //报错
?int* c = const_cast<int*>(func()); //正确
?const int* b = func(); //正确
(3)const 成员函数
不修改数据成员的函数都尽量声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。
以上是关于const 在c及c++中应用的主要内容,如果未能解决你的问题,请参考以下文章