c++的静态成员详解

一、前言
类是类型而不是数据对象,每个类的对象都是该类数据成员的拷贝。然而,往往我们需要让类又有对象在类范围了内共享一个数据。这个时候,就需要定义一个静态成员,来满足类的这个要求。例如:当我们定义了一个学生类的时候,我们希望有一个变量可以帮助我们记录当前学生的总人数,如果使用全局变量的话,就会破坏类的封装性,于是这个时候就可以定义静态数据成员,来记录学生的总人数。

二、静态成员的分类以及声明方式

分类:
- 静态数据成员
- 静态成员函数
声明:
类名::静态成员名

三、静态数据成员变量


class Student
{
protected:
    static int num;             //声明静态数据成员
public:
    Student()
    {
        num++;
    }
    static void print()
    {
        cout << num << endl;
    }

};
int Student::num = 0;     //静态数据成员必须在类外部初始化,

int main()
{
    Student s;

    Student::print();
    system("pause");
    return 0;
}

静态数据成员的注意事项:

  1. 静态数据成员,不属于任何一个对象,它是属于类的。如果使用对象去访问静态数据成员,那么编译器只关心该对象的类型,不关心该对象是什么。
  2. 静态数据成员,必须要进行初始化,而且必须要在类的外部初始化(类声明指声明类的一个“尺寸”“规格”,但是不对他进行内存分配),最好是在类定义完后,接着就是初始化类的静态数据成员。初始化方式见上述的例子
  3. 不可以通过类名访问非静态成员变量,可以用类名或者对象名访问静态成员变量。访问方式不同(类名::静态成员变量名,对象名.静态成员变量名)

四、静态成员函数

#include<iostream>
using namespace std;

class Student
{
protected:
    static int num;
    int num1;
public:
    Student()
    {
        num1 = 2;
        num++;
    }
    static void print()
    {

        cout << num << endl;               //可以直接访问类的内部成员
    }

};
int Student::num = 0;

int main()
{
    Student s;

    Student::print();
    system("pause");
    return 0;
}

静态成员函数的注意事项:

  1. 静态成员函数与其他类成员函数不同一点是:它的参数中不存在默认的this指针,例如一个普通的成员函数void a(),编译器对其进行编译时,它会被转换为:void a(Student * this),而静态成员函数就是少了这个this指针
  2. 因为没有this指针,所以静态成员函数不可以访问非静态成员(包括函数和变量)。
  3. 静态成员函数可以通过类名或者对象名进行调用,但是在最好是使用类名调用,因为使用对象名调用时,它还是只看该对象是什么类型,本质还是类名调用。
静态成员是指在类使用static关键字声明的成员。它们不依赖于类的实例化,而是与类本身相关联。静态成员具有以下几个特点: 1. 静态成员属于类,而不属于类的实例。这意味着无论创建多少个类的实例,静态成员只有一个副本,被所有实例共享。 2. 静态成员可以直接通过类名访问,而无需实例化类对象。例如,可以通过ClassName.staticMember的形式来访问静态成员。 3. 静态成员在类的初始化阶段被创建,并在整个程序的执行过程存在。它们会在程序启动时进行初始化,直到程序结束时才会被销毁。 4. 静态成员可以访问类的非静态成员,但非静态成员无法直接访问静态成员。这是因为静态成员的存在不依赖于类的实例,而非静态成员的访问需要通过实例化类对象。 5. 静态成员可以用于共享数据或者统计类的实例个数等功能。例如,可以使用一个静态成员变量来记录类的实例数目。 需要注意的是,静态成员在内存只有一份副本,如果对静态变量进行修改,那么这个修改会对所有实例产生影响。此外,静态成员还可以通过静态成员函数来访问和修改,这些静态成员函数也不依赖于类的实例。 总之,静态成员是与类相关联的成员,具有独特的访问方式和生命周期。它们在编写程序时具有一定的灵活性和实用性,可以用于共享数据和实现功能的统计等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值