C语言static和const的区别

static:
1、不考虑类,static的作用:
    1)第一个作用:隐藏。使得全局变量和函数对其它文件不可见,同时避免了不同文件的命名冲突。
    2)第二个作用:默认初始化为0。未初始化的全局静态变量和局部静态变量都保存在BBS段,BBS段的特点是,程序运行之前会自动清零。
    3)第三个作用:保持局部变量内容的持久性。此变量声明周期是整个程序的声明周期,但是作用域只在声明它的函数中。

2、类中的static,表示属于某个类单数不属于类的任何特定对象的变量和函数。
    1)对于类的静态数据成员:
        a、类的静态数据成员独立于该类的任意对象而存在;其值的修改被类的所有对象看见。
        b、static数据成员必须在类定义的外部定义,通常放在包含类的非内联成员函数定义的文件中。
        class A
        {
            stctic double d = 0.03;//错误
        };
        c、但是也有例外,const static 数据成员可以在类的定义体中进行初始化,因为const定义时必须初始化。

    2)对于类的成员函数:
        a、static成员函数由于不与任何对象关联,因此它不具备this指针,因此,它无法访问属于类对象的非静态数据成员,也无法访问
        非静态成员函数。也就是说,类的静态成员函数,只能调用该类的其它静态成员函数和静态数据成员。
        b、static成员不是任何对象的组成部分,所以成员函数不能被声明为const。此外,static成员函数也不可以声明为virtual,volatile。

关于静态成员函数的总结:
    (1)静态成员之间可以相互访问,不能访问非静态成员。非静态成员函数可以任意访问静态和非静态成员。
    (2)静态函数执行速度比非静态函数稍快。

const:
1、const定义后就不能修改,因此定义时要初始化。

2、在C语言中
    const buffsize = 10;
    int buf[buffsize];
    是错误的;
    而在C++中是正确的。C中改为const int buffsize;

3、使用const比使用#define有更多的优点:
    1)const常量有数据类型,而宏常量没有。前者可以进行类型安全检查,而后者只是进行简单的字符替换。
    2)使用const可能比#define得到更小的目标代码,因为替换可能会是同一变量在不同的地方有多个备份。
    3)const执行常量折叠,编译时可以把一个复杂的常量表达缩减成简单的。
总之,我们建议使用const替换#define

4、指针和const修饰符:
    记住以下一个规则就足够了,即以'*'为分界,左边是对象,右边是指针。
    1)const在左边表示指针指向const对象,指针可变,对象不可变。
    2)const在右边表示const指针,指针不可修改,对象可以修改。

5、const修饰函数参数
    1)const形参可以接受非const实参,但是非const形参不兼容const实参。因此,我们为了避免这种问题,尽量使用const修饰形参。
    2)由于gcc下,临时对象是const类型,基于1),形参必须声明为const类型,否则出错。

6、const在类中的应用
    1)this指针是const,假设base是一个类,这 base *const this;
    2)而const修饰的成员函数,其this指针指向的是一个const对象,即 const base *const this;const成员函数不能修改调用该函数的对象。
    3)非const对象,既可以调用const成员函数,也可以调用非const成员函数;而const对象,只能调用const成员函数。
    4)const数据成员,必须在构造函数的成员初始化列表中进行初始化。

7、关于C++中,static、const以及static,const成员变量的初始化:
在C++中,static成员变量只能在类的内部声明不能再类内部进行初始化,通常在类的实现文件中初始化,static关键字只能用于类定义体内部声明中,定义时不能标示为static。
在C++中,const成员变量也不能再类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。const数据成员只在某个对象声明周期内是常量,而对于整个类而言,确实可变的。因为类可以创建多个对象,不同对象其const数据成员的值可以不同,所以不能再类声明中初始化const数据成员,因为对象没有被创建,编译器不知道const数据成员的值是什么。
const数据成员的初始化只能在类的狗仔函数的初始化列表中进行,想要建立整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static const 。

C语言static和const的区别相关推荐

  1. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  2. C C++中关于全局变量静态变量,extern,static,const的区别与总结

    一.extern 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也 ...

  3. Static与Const的区别

    转载自博客园如鱼饮水,冷暖自知的文章:https://www.cnblogs.com/Jinfeng1213/p/8597446.html static static局部变量 将一个变量声明为函数的局 ...

  4. c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...

    原标题:嵌入式系统C语言重点语法const.volatile.static.堆栈等的意义及用法 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场. 要点:堆, ...

  5. C# static readonly 与 const 的区别

    static readonly 与 const 的区别: const 表达式的值是在编译时形成的: static readonly 表达式的值直到程序运行时才形成: 转载于:https://www.c ...

  6. c语言中{的作用,C语言中Static和Const关键字的作用

    C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...

  7. C语言 static - C语言零基础入门教程

    目录 一.static 简介 二.static 修饰变量 1.static 局部静态变量 2.static 全局静态变量 三.static 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  8. 关于static 和 const

    static和const 的概念老是搞不清楚..下面就从网上摘录下部分区别: 关于static 在c中,static 用于信息屏蔽,你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以 ...

  9. C语音static、const、voilate和位运算

    目录 一 static 1 在C语言中 2 在C++中,多了以下两点 3 静态数据成员可以成为成员函数的可选参数,普通数据成员不可以 4 静态数据成员的类型可以是所属类的类型,普通数据成员不可以 5 ...

最新文章

  1. 【swjtu】数字电路实验7_8_电子琴设计
  2. 北邮计算机发展,北邮计算机学科前景怎样?升学就业如何?26日教授亲自来解读...
  3. [bbk5128]第12集 - Chapter 06- Working with Composite Data Types -01-4998(Record)
  4. 外挂学习之路(5)--- 写测试call的注意事项
  5. 集成学习框架-学习小结20161121
  6. odoo tree视图过滤数据_OpenERP Odoo 搜索视图设置默认过滤按钮(filter button)
  7. c#图片处理之:在图片上打上文字
  8. 微服务技术图片资源汇总
  9. c盘存放文件夹的功能
  10. Android音频系统
  11. 两个正态总体均值差的置信区间
  12. cad文字递增快捷键_CAD文字/表格递增复制怎么用,快捷键是什么?
  13. python 正则表达式 ,看这篇就够了
  14. App Store应用TOP榜:究竟有多少款App在使用Swift?
  15. 如何在没有密码的情况下打开 Vivo 手机
  16. 安装Visio失败提示安装即点即用版本 利用office部署工具安装visio2016
  17. 【python系列】使用mayavi画3d散点图
  18. Lenovo 拯救者15ISK升级BIOS
  19. 隐枚举法matlab程序,隐枚举法例题
  20. JVM成神之路-Java垃圾回收

热门文章

  1. 数字图像处理知识体系小结(转)
  2. 在数据库录入词典数据时,如何自动生成uuid
  3. Matlab:在 GUIDE 中设置 UI 窗口大小
  4. (附源码)ssm欢欢宠物医院管理系统的设计与实现 计算机毕设171734
  5. 在计算机术语中 ram,计算机术语 RAM ROM
  6. 熵、信息增益、信息增益率
  7. 荟味齐鲁鲁菜网站/美食网站/菜谱网站
  8. ZZULIOJ:1096: 水仙花数(函数专题)
  9. 福利丨好书申请免费送【1.12】
  10. gtkpod + ipod-convenience 后同步 iTunes 出现 -54 未知错误的解决方法