0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言类型修饰符Const的教程使用说明

电子设计 2018-09-20 09:37 次阅读

Const也是应该广泛的关键字,表示后面定义有可能是一个不变的常量,但是跟各种数据类型定义组合,能演变出复杂含义。常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

Const 主要有如下应用情况

1. 声明后面是一个常量

2. 如果跟指针组合,将形成复杂的组合情况

3. 作函数参数数的修饰符。表示不能修改这一参数的值。主要是指针

4. 作函数返回值, 表示调用函数不能修改这一参数数的值。主要是指针

Const 让人感到复杂是的,他的位置可以与被修饰的数据类型互换!其它的修饰符没有这样用法。这样换一般情况下是等效的, 如 const int c1= 5; 等效于 int const c1=5;但是,我说是但是,如果数据类型是一个指针,互换一样位置表示完全不同含义,所以const 这 一个用法经常是面试官用来折磨嵌入式C面试者的法宝之一。 参看如下定义 int b = 500; 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]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无 关),这种情况下不允许对指针指向内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。

Const的初始化 Const 在运行时不能修改值,所以只能在定义时进行初始化。 作为参数和返回值的const修饰符 其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量 1 修饰参数的const,如 void fun0(const A* a );表示a的指向内容不准修改的。 2 修饰返回值的const,如const A * fun2( );表示a指南内容不准备修改。

Const 的好处是

•关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

• 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

• 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。 Const 一大副作用是,在函数调用时,你必须要把参数调成const 所要求的形式才能被编译调用。有时这样花很大功夫才能做到。

C++ const用法说明

C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

1.const 修饰成员变量

#include《iostream》

using namespace std;

int main(){

int a1=3; ///non-const data

const int a2=a1; ///const data

int * a3 = &a1; ///non-const data,non-const pointer

const int * a4 = &a1; ///const data,non-const pointer

int * const a5 = &a1; ///non-const data,const pointer

int const * const a6 = &a1; ///const data,const pointer

const int * const a7 = &a1; ///const data,const pointer

return 0;

}

const修饰指针变量时:

(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

2.const修饰函数参数

传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。

void testModifyConst(const int _x) {

_x=5;///编译出错

}

3.const修饰成员函数

(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)

(2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

#include 《iostream》

using namespace std;

class Point{

public

Point(int _x):x(_x){}

void testConstFunction(int _x) const{

///错误,在const成员函数中,不能修改任何类成员变量

x=_x;

///错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量

modify_x(_x);

}

void modify_x(int _x){

x=_x;

}

int x;

};

4.const修饰函数返回值

(1)指针传递

如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。

const int * mallocA(){ ///const data,non-const pointer

int *a=new int(2);

return a;

}

int main()

{

const int *a = mallocA();

///int *b = mallocA(); ///编译错误

return 0;

}

(2)值传递

如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。

所以:

不要把函数int GetInt(void) 写成const int GetInt(void)。

不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136129
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    8148
收藏 人收藏

    评论

    相关推荐

    C语言之正确使用Const

    ,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰
    发表于 10-07 11:20

    C语言——正确使用const

    这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰
    发表于 04-23 11:58

    请问C++代码的修饰符该怎么理解?

    有如下的代码段,写出下面除了宏定义外的其他代码的真实代码(即预处理后的代码)。然后写出对const修饰符的理解(当前的代码用于单片机中):#define DECL_PC_CMD_FUN(name
    发表于 11-11 04:35

    请问什么是正则表达式修饰符

    什么是正则表达式的修饰符
    发表于 11-04 06:10

    【原创】带你在单片机编程中熟练使用const

    const可以用在类型说明符前,也可以用在类型说明符后例如:intconsti = 2; 或 constinti=2;4、
    发表于 06-15 11:00

    C51语言的变量定义方式

    C51 语言的变量定义定义方式:普通变量:(修饰符)数据类型 [存储类型] 变量名 [= 值]指针变量: (
    发表于 12-01 06:18

    HAL库中__weak修饰符是什么?

    单片机系统时钟是什么?HAL库中__weak修饰符是什么?
    发表于 02-23 07:32

    C语言类型修饰符Volatile的使用说明

    C语言是我们经常需要用到的语言C语言中的类型修饰符
    的头像 发表于 09-19 10:54 3521次阅读

    如何学习c语言C语言学习笔记资料免费下载

    本文档的主要内容详细介绍的是如何学习c语言C语言学习笔记资料免费下载内容包括了:C语言代码,编
    发表于 10-17 16:23 66次下载

    C语言教程之数据类型与运算的详细资料说明

    本文档的主要内容详细介绍的是C语言教程之数据类型与运算的详细资料说明主要内容包括了:数据类型
    发表于 03-01 17:20 8次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>教程之数据<b class='flag-5'>类型</b>与运算<b class='flag-5'>符</b>的详细资料<b class='flag-5'>说明</b>

    一种修饰符能使变量在处理器复位而不被初始化

    有一种修饰符能使变量在处理器复位而不被初始化
    的头像 发表于 03-14 15:01 3959次阅读
    一种<b class='flag-5'>修饰符</b>能使变量在处理器复位而不被初始化

    C51 单片机的 C 语言中的变量定义与硬件之间的关系

    C51 语言的变量定义定义方式:普通变量:(修饰符)数据类型 [存储类型] 变量名 [= 值]指针变量: (
    发表于 11-23 16:51 3次下载
    <b class='flag-5'>C</b>51 单片机的 <b class='flag-5'>C</b> <b class='flag-5'>语言</b>中的变量定义与硬件之间的关系

    C#中的两个泛型修饰符

    C#中,存在两个泛型修饰符:in和out,他们分别对应逆变委托和协变委托。 我们知道,在C#中要想将一个泛型对象转换为另一个泛型对象时,必须要将一个泛型对象拆箱,对元素进行显式或隐式转换后重新
    的头像 发表于 01-14 11:48 1007次阅读

    Java四种访问修饰符及访问范围

    public修饰的类、类属变量及方法,包内及包外的任何类均可以访问;任何情况下都可以访问;如果一个类、类属变量及方法没有用任何修饰符,则其访问权限为默认权限,只认包。同包下可以访问,同包下子类可以访问,只要不同包,普通类和子类都不能访问。
    的头像 发表于 02-28 14:35 6541次阅读

    浅析C语言中的变量修饰符

    一、修饰符类型51单片机采用哈佛结构。内存空间编址有重叠。可以在不同总线上定义不同的变量。在KEILC51中定义了data、idata、xdata、code几种域修饰符。这些修饰符决定
    的头像 发表于 04-15 08:10 534次阅读
    浅析<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的变量<b class='flag-5'>修饰符</b>