• C++ static静态成员函数


    普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员

    编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数

    普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量

    普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数

    静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Student {
    public:
        Student(const string& name, int age, float score);
        void show();
    public:         //声明静态成员函数
        static int getTotal();
        static float getPoints();
    private:
        static int m_total;  //总人数
        static float m_points;  //总成绩
    private:
        string m_name;
        int m_age;
        float m_score;
    };
    int Student::m_total = 0;
    float Student::m_points = 0.0;
    Student::Student(const string& name, int age, float score) : m_name(name), m_age(age), m_score(score) {
        m_total++;
        m_points += score;
    }
    void Student::show() {
        cout << m_name << "的年龄是" << m_age << ",成绩是" << m_score << endl;
    }
    //定义静态成员函数
    int Student::getTotal() {
        return m_total;
    }
    float Student::getPoints() {
        return m_points;
    }
    int main() {
        (new Student("小明", 15, 90.6))->show();
        (new Student("李磊", 16, 80.5))->show();
        (new Student("张华", 16, 99.0))->show();
        (new Student("王康", 14, 60.8))->show();
        int total = Student::getTotal();
        float points = Student::getPoints();
        cout << "当前共有" << total << "名学生,总成绩是" << points << ",平均分是" << points / total << endl;
        return 0;
    }

    静态成员函数可以通过类来调用(一般都是这样做),也可以通过对象来调用 

  • 相关阅读:
    【MariaDB】MariaDB的复制
    【MariaDB】MariaDB编译参数
    【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
    【MySQL】查询使用临时表
    【MySQL】使用mysqlbinlog回滚
    ELK学习笔记(三)单台服务器多节点部署
    ELK学习笔记(二)-HelloWorld实例+Kibana介绍
    ELK学习笔记(六)分布式集群
    ELK学习笔记(四)SpringBoot+Logback+Redis+ELK实例
    ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13523592.html
Copyright © 2020-2023  润新知