• 【C++入门】静态成员详解(定义、实现原理、使用注意事项)


    1、类的静态成员

    (1)在类中用static修饰成员,则该成员是静态成员;
    (2)静态成员是属于类本身的,所有类的对象共享;
    (3)类的对象都可以访问静态成员,但是所有类的成员访问的静态成员都是同一份静态成员;
    (4)静态成员在类内部声明时加static声明,在类外定义静态成员时无需添加static修饰;

    2、静态成员的使用场景

    (1)因为静态成员是属于类而不是属于单个对象的,所以静态成员用来记录类相关的信息;
    (2)比如:用静态成员来统计创建了多少个类的对象;

    3、、静态成员使用

    3.1、示例代码

    #include 
    
    using namespace std;
    
    class Person
    {
    private:
    
    public:
    	int age;			// 普通成员变量
    	static int cnt;		//统计程序存在的中类的对象个数
    	
    	Person(void);	//构造函数
    	~Person(void);	//析构函数
    };
    
    //在构造函数中cnt加一
    Person::Person(void)
    {
    	age = 18;
    	Person::cnt++;	//方式1
    	//cnt++;		//方式2
    	//this->cnt++;	//方式3
    }
    
    //在析构函数中cnt减一
    Person::~Person(void)
    {
    	Person::cnt--;
    }
    
    // 对Person类中的静态成员定义		
    int Person::cnt;	
    
    int main(void)
    {
    	cout << "Person::cnt = " << Person::cnt << endl;
    	
    	Person *p1 = new Person();
    
    	cout << "Person::cnt = " << Person::cnt << endl;
    	Person *p2 = new Person();
    
    	cout << "Person::cnt = " << Person::cnt << endl;
    	Person *p3 = new Person();
    
    	cout << "Person::cnt = " << Person::cnt << endl;
    	
    	delete(p1);
    	cout << "Person::cnt = " << Person::cnt << endl;
    
    	delete(p2);
    	cout << "Person::cnt = " << Person::cnt << endl;
    
    	delete(p3);
    	cout << "Person::cnt = " << Person::cnt << endl;
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    (1)静态变量和普通变量的区别:静态变量在类中只是用static来声明,需要在类外进行定义;
    (2)创建Person类的对象时会调用构造函数,构造函数会对cnt加一;
    (3)销毁Person类对象时会调用析构函数,析构函数会对cnt减一;
    上面代码的效果:用类的cnt静态变量来统计程序中还存放多少个Person类的对象;

    3.2、代码结果分析

    Person::cnt = 0
    Person::cnt = 1
    Person::cnt = 2
    Person::cnt = 3
    Person::cnt = 2
    Person::cnt = 1
    Person::cnt = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (1)每次创建Person类的对象都会调用对象自己的构造函数,从上面的程序执行结果可以得出结果,每个对象的构造函数操作的cnt都是同一份cnt;
    (2)析构函数也是如此;
    总结:对象操作的类静态成员都是同一份;

    4、静态成员的使用注意事项

    (1)静态成员变量/函数,需要在类外面进行定义;
    (2)普通成员函数可以调用静态成员变量和函数;
    (3)静态函数只能访问静态函数和静态变量,不能访问任何非静态的东西;
    (4)在对象的构造函数中不能对静态变量进行初始化,因为静态变量不属于单个对象,不需要对象去初始化;

    5、静态成员的本质

    (1)从上面的例子可以看出,静态变量在类中用static声明,但是要在类外进行定义;普通的成员变量都是创建对象时自动创建的;
    (2)静态成员的本质就是全局变量和全局函数,在类中用static声明,相当于把类和这个全局变量/函数进行绑定;
    (3)因为静态成员是全局变量/函数,生命周期是整个程序的生命周期,所以我们不需要创建对象就可以使用静态成员;

  • 相关阅读:
    学SLAM的女生,很酷
    FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr
    【Unity3D日常开发】Unity3D工具之UnityForSVN
    《微积分的力量》读书摘记
    基于JSP的IQ智力测试系统
    泊松积分、伽马函数——公式干货总结
    公司要做大数据可视化看板,除了EXCEL以外有没有好用的软件可以用
    Linux常用指令--查找指令
    TMS320F28374S之DAC
    IP(网际)协议学习
  • 原文地址:https://blog.csdn.net/weixin_42031299/article/details/127593243