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 。

使用static与const关键字时需要掌握的知识的更多相关文章

  1. C++ —— 类中static和const关键字声明变量的初始化方式总结

    在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...

  2. C语言中Static和Const关键字的的作用

    程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块 ...

  3. C语言之头文件,static与const关键字

    [前言] 最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考.平时也都是用印象笔 ...

  4. static和const关键字的作用

    static关键字至少有下列n个作用: (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)在模块内的stat ...

  5. C语言中Static和Const关键字的的作用 -- 转

    static作用:“改变生命周期” 或者 “改变作用域” 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-- ...

  6. C++中static和const关键字的作用

    static关键字至少有下列几个作用: 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: 在模块内的static全局变量 ...

  7. static和const关键字

    C#与C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类   面向过程 静态全局变量 静态全局变量在声明它的整个文件 ...

  8. 【PHP面向对象(OOP)编程入门教程】15.static和const关键字的使用(self::)

    static关键字是在类中描述成员属性和成员方法是静态的:静态的成员好处在哪里呢?前面我们声明了“Person”的人类,在“Person”这个类里如果我们加上一个“人所属国家”的属性,这样用“Pers ...

  9. PHP面向对象(OOP):.static和const关键字的使用(self::)

    static关键字是在类中描述成员属性和成员方法是静态的:静态的成员好 处在哪里呢?前面我们声明了“Person”的人类,在“Person”这个类里如果我们加上一个“人所属国家”的属性,这样用“Per ...

随机推荐

  1. 【转】布同:如何循序渐进学习Python语言

    大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...

  2. maps.reg

    ^/(.*\.miaopai.com/stream/.*\.mp4\?.*) http://$1 ^/([[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{ ...

  3. AdobeFlashBuilder还不如AdobeFlashProfessional写actionscript体验好

    AdobeFlashBuilder还不如AdobeFlashProfessional写actionscript体验好. 这真是奇怪了.

  4. quartz的一些记录

    定时任务总会遇到任务重叠执行的情况,比如一个任务1分钟执行一次,而任务的执行时间超过了1分钟,这样就会有两个相同任务并发执行了.有时候我们是允许这种情况的发生的,比如任务执行的代码是幂等的,而有时候我 ...

  5. fiddler2请求参数乱码

    win7 1.windows按钮+R 2.输入regedit +回车+是 3.HKEY_CURRENT_USER\Software\Microsoft\Fiddler2 4.右键新建,选字符串值 加上 ...

  6. BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]

    传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...

  7. Office 365 机器人(Bot)开发入门指南 (新篇)

    最近在整理书稿时,发现我在2017年7月份写的这篇 Office 365 机器人(Bot)开发入门 的内容,因为相关平台的升级,已经完全不能体现当前的开发过程,所以我再专门写一篇新的开发入门指南给有兴 ...

  8. htmlUtil 网页爬取工具

    Htmlunit是一款模拟浏览抓取页面内容的Java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取 /** * 获取页面的TITL ...

  9. Dagger2 使用全解析

    Dagger2 使用全解析 Dagger是一个注入工具,何为注入,我们要生产一批机器人,每个机器人都有一个控制器,我们可以在机器人内部 new 出一个控制器: class Robot { val co ...

  10. HTML/CSS 常用单词整理

    页面布局(layout) header 头部/页眉: index 首页/索引: logo 标志: nav/sub_nav 导航/子导航: banner 横幅广告: main/content 主体/内容 ...