C++学习笔记——静态成员变量和静态函数

文章目录

    • 一、静态数据成员
        • summary
    • 二、静态成员函数

一、静态数据成员

class Test{
private:
	//静态数据成员
	static int a;

静态成员变量在类中只能声明而不能定义赋值。
要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0

class Test{
public:
	int GetA() const{return a;}
private:
	//静态数据成员
	static int a;
};
//int Test::a;如果这样定义不赋予初值则初值为零
int Test::a = 1;
#include 
int main()
{
	Test T;
	std::cout << T.GetA() << std::endl;
}
#include 
#include 
using namespace std;
class Account
{

public:
    static double m_rate; // 声明:独立于类的对象之外
    static vector<int> m_V;
    static void set_rate(const double &x)
    {
        m_rate = x;
    }
};
//静态类型变量必须在类外定义,而且必须定义,不定义就报错。
double Account::m_rate = 4; // 类型 + 类名 + 静态变量。
vector<int> Account::m_V;   //vector可初始化为空,但必须初始化

int main()
{
    Account::set_rate(5.0); //类名调用
    cout << Account::m_rate << endl;
    Account a;
    a.set_rate(7.0); // 对象调用静态成员函数,编译器将不再会在参数里添加this指针,这个隐含的操作
    cout << Account::m_rate << endl;
    return 0;
}

summary

也就是说我们在使用的时候,在头文件类中声明静态变量,在源文件中初始化该静态变量。
静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员。也就是整个程序中他只有一份。调用该类就调这一份该成员变量。不管你创建多少个对象,都共享使用这一个成员变量。

二、静态成员函数

静态成员函数的声明也很简单,就是在类的成员函数前加上static关键字即可,和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象。
静态成员函数中是不能访问本类中的非静态数据成员的。
静态的数据成员和静态的成员函数是已经在内存中开辟了内存空间了,所以静态数据成员可以独立的访问在任何类对象没有建立起来都可以访问

class Student
{
public:
    //定义构造函数
    Student(int n, int a, float s) : num(n), age(a), score(s) {}
    //普通成员函数
    void total();
    //声明静态成员函数
    static float average();

private:
    int num;          //编号
    int age;          //年龄
    float score;      //分数
    static float sum; //静态成员变量,累计学生的总分
    static int count; //静态成员变量,累计学生的人数
};
//在全局作用域对静态数据成员初始化,如果不赋予初值,则使用其默认值零
float Student::sum;
int Student::count;
//定义非静态成员函数,非静态可以调用静态成员变量
void Student::total()
{
    sum += score; //累加总分
    count++;      //累计已统计的人数
}
//定义静态成员函数
float Student::average()
{
    return (sum / count);
}

int main()
{
    //创建三个学生对象
    Student stud[3] = {
        Student(1001, 18, 70),
        Student(1002, 19, 78),
        Student(1005, 20, 98)};
    //调用3次total函数
    for (int i = 0; i < 3; i++)
    {
        stud[i].total();
    }
    //调用静态成员函数
    std::cout << "the average score of students is " << Student::average() << std::endl;
}

通过以上例子说明:我们把所有对象的共性或者公共值放到静态变量或者静态函数中。要使用所有对象的属性,就使用静态。

你可能感兴趣的:(C++学习笔记)