• static在cc++中的作用(翁恺c++公开课[28-29]学习笔记)


      static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数);cc++中静态变量、对象的初始化是在mian函数运行之前被初始化的,而且是没有顺序的,如果多个静态变量、对象有依赖顺序,最好定义在同一个文件中,或者直接不要这么做。

    c中:

    static主要定义全局、局部静态变量以及定义静态函数;全局静态变量和全局局部变量其实是一样的,可以统称为静态变量,注意:局部变量在第一次进这个函数时会被初始化之后不会再被初始化。

    1. 全局静态变量:在全局区分配内存,没有初始化其默认值为0,只会初始化一次、该变量只在本文件内从定义开始到文件结束可见。
    2. 全局静态函数:在全局区分配内存、该函数只在本文件内从定义开始到文件结束可见。

    c中staic就被赋予了两种不同的职责,在c语言中static的临时变量(在函数内声明的变量)就是全局变量,static声明的变量、函数不能在其它文件中访问,只能在当前文件内使用。

    c++中:

    静态成员函数、成员变量的设计初衷,就是要做一种成员变量和函数,使其与类的某一个对象无关(也就是说可以在此类所有的对象之间共享),接下来我们进行详细的使用场景说明。

    静态对象:在mian函数运行之前被初始化,在程序结束之前被析构,其余和c的全局变量一致。

    在c++中控制变量和函数的可见性有了更好的解决方案:成员变量、成员函数及类的访问控制符(private public protected)

    静态成员变量:如果类中声明一个静态的成员变量,那么这个静态成员变量在所有这个类的对象中的值是保持一致的;那他是怎么实现的呢,其实很简单,请看 “int A::i =20;”这行代码,他其实就是声明了一个叫“A::i”的全局变量来实现的,这里的“A::i”和C语言中的声明全局变量“static int i=20;”中的i是代表一个东西,都是变量的一种形式,只不过c++中的static写到了类里边。

    #include <iostream>
    using namespace std;
     class A
    {
    public:
            //A():i(0) { }  //初始化列表不能初始化静态成员变量
            A() { i = 0; }
            void print() { cout << i << endl; }
            void set(int ii) { i=ii; }
          
    private: static int i; };
    int A::i = 20; //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义;还就是这是这段代码首先被执行的命令行,再到main,再到A的构造函数
    int main() { A a,b; a.set(10); b.print(); return 0; }

    initialized构造函数初始化列表只能对非静态成员变量做初始化,我们改一下构造函数的初始化方式,编译器就会报错!

    #include <iostream>
    using namespace std;
     class A
    {
    public:
            A():i(0) { }  //初始化列表不能初始化静态成员变量
            //A() { i = 0; }
            void print() { cout << i << endl; }
            void set(int ii) { i=ii; }
    private:
            static int i;
    };
    int A::i = 20;  //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义
    int main()
    {
            A a,b;
            a.set(10);
            b.print();
            return 0;
    }

     

     静态成员变量与成员变量就只有上述两个区别

    1. 静态成员变量在所有这个类的对象中的值是保持一致的;
    2. 不能用构造函数初始化列表来做静态成员变量的初始化。

    静态成员函数

    C++中静态成员函数和c中有较大的区别,主要的原因是:静态的成员函数设计初衷就是使此函数与对象无关

    1. C++中静态的成员函数只能调用 静态的成员函数和静态成员变量,而不能调用非静态的成员函数、变量;
    2. 静态成员函数中不能使用this指针,因为this是对象的this,完全可以在不定义对象的情况下访问类内的静态函数 " A::say(0); ";
    #include <iostream>
    using namespace std;
     class A
    {
    public:
            //A():i(0) { }  //初始化列表不能初始化静态成员变量
            A() { }
            void print() { cout << i << endl; }
            //void set(int ii) { i=ii; }
            void set(int i) { this->i = i; }  //this指针访问并修改静态成员变量是可以的
            static void say(int ii)
            {
                    cout << ii << endl;
                    cout << this->i << endl;  //编译报错
                    cout << i << endl;
            }
    private:
            static int i;
    
    };
    
    int A::i = 20;  //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义
    
    int main()
    {
            A a,b;
            a.set(10);
            b.print();
    
            a.say(0);
            A::set(2);      //编译报错
            A::say(0);
            return 0;
    }

    当我们把下边这两行注释掉后,编译运行就没问题了

    cout << this->i << endl;  //编译报错
    A::set(2); //编译报错

     

    特别鸣谢:

    看完这期视频简直就是太崇拜翁恺老师了,建议对一些c++基础比较模糊的同学好好看看翁恺老师的视频,比看书和看博文有用多了,不仅给讲原理还会给将实现,毕竟c++可以用c来实现的,视频链接在上一篇内有,看完视频真的不夸张的说“胜读十年书”,只能说浙大的同学们有福了,这么早就有这么好的启蒙老师。

    目录

    1. c++(翁恺浙大公开课) 笔记0
    2. static在cc++中的作用(翁恺c++公开课[28-29]学习笔记)
    3. c++对象初始化(翁恺c++公开课[10])
    4. c++构造函数的初始化列表(翁恺c++公开课[13])
    5. c++继承:公有、私有、保护
    6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
    7. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
    8. c++多态性及多态的内部实现(翁恺c++公开课[23-24])
    9. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
    10. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
    11. c++模板(翁恺c++公开课[34-35]学习笔记)
    12. 最好不要在头文件中写函数定义
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/12115341.html
Copyright © 2020-2023  润新知