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++中应用的主要内容,如果未能解决你的问题,请参考以下文章

c++ operator 的CONST应用

c++中const是怎么使用的?

如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化序列

C++ constexpr类型说明符

c++是 ??

(转载)C++ string中find() ,rfind() 等函数 用法总结及示例