zoukankan      html  css  js  c++  java
  • 使用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 。

    CMenuApp.h
    class CCMenuApp : public CWinApp
    {
    public:
    	CCMenuApp();
        const  int m_i;     //构造函数初始化列表
        static int m_j;     //类外初始化
        static const int m_k = 0;//直接初始化
    };
    
    CMenuApp.cpp
    int CCMenuApp::m_j = 0;
    CCMenuApp::CCMenuApp()
    :m_i(0),
    {
    }

    8、static const 和 const static区别

    static const 和const static 在本质上没有区别,但是更推荐static const这种写法,否则会有pclint 告警问题;

  • 相关阅读:
    rake db:migrate学会的一些tips
    不提拔你,就因为你只想把工作做好
    jira4r:使用Ruby操作JIRA
    <当下的力量>读书笔记
    Your template was not saved as valid UTF8. 解决方法
    lxml.etree 教程3:Elements carry attributes as a dict
    Ruby目录及文件操作
    体验最火的敏捷SCRUM!(网络直播课程 免费)
    UMLonline技术沙龙:体验一把SCRUM(20121027 广州 免费)
    视频分享:挨踢项目求生法则(1)——团队建设篇
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468262.html
Copyright © 2011-2022 走看看