zoukankan      html  css  js  c++  java
  • 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. 最好不要在头文件中写函数定义
  • 相关阅读:
    maven配置checkstyle插件对代码规范进行静态检查
    maven项目使用jacoco插件检测代码覆盖率详细配置
    bzoj4390[Usaco2015 dec]Max Flow*
    bzoj4393[Usaco2015 Dec]Fruit Feast*
    bzoj4397[Usaco2015 dec]Breed Counting*
    bzoj4396[Usaco2015 dec]High Card Wins*
    bzoj4395[Usaco2015 dec]Switching on the Lights*
    bzoj1725[Usaco2006 Nov]Corn Fields牧场的安排*
    bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛*
    bzoj3396[Usaco2009 Jan]Total flow 水流*
  • 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/12115341.html
Copyright © 2011-2022 走看看