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

    文章

    7513

    浏览量

    124090
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    7941
收藏 人收藏

    评论

    相关推荐

    C语言之正确使用Const

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

    C语言——正确使用const

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

    “无注册”修饰符如何防止变量被保存到CPU寄存器中?

    好的,我的意思是,我希望真正的内存位置(无论是全局的还是本地的,不是基于堆栈的,变量)都要更新,所以当中断发生时,它会找到一个更新的值。我知道“寄存器”修饰符,但它正好相反。F我想做什么,我在文档中
    发表于 10-09 11:09

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

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

    C语言数量与变量

    定义给常量赋予特定含义 如: #define CLOSE_LED 0 关灯2) 使用关键字const定义Const是一个修饰符,也是32个关键字中的一个,当一个变量定义时前面加const
    发表于 03-15 15:04

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

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

    【每日一知识点】C语言const详解

    马上就想到了常量。事实上在C语言const功能很强大,它可以修饰变量、数组、指针、函数参数等。1、 修饰变量:
    发表于 03-29 10:53

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

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

    C语言语句的规则函数

    的,而C语言语句的规则函数返回的数据类型+函数名+参数+函数主体所以这几行代码也就不难理解了。该函数类型是void型,函数名称是Delay,_IO是
    发表于 07-14 08:13

    c语言中整数的取值范围是多少

    c语言中整数的取值范围,文章目录1、整数的取值范围2、版权声明整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键
    发表于 07-20 07:50

    C51语言的变量定义方式

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

    HAL库中__weak修饰符是什么?

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

    单片机的C语言里面,有个修饰const,这个词放到变量类型前和后有什么区别吗?

    单片机的C语言里面。有个修饰const,这个词放到变量类型前和后有什么区别吗?我看到有网友发的两个贴里有这两个用法,不太懂
    发表于 06-20 08:24

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

    C语言是我们经常需要用到的语言,C语言中的类型修饰符Volatile大家知道怎么使用吗? volatile是一个
    的头像 发表于 09-19 10:54 3244次阅读

    C#中的两个泛型修饰符

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