2020-4-28_静态成员

2020-4-28_c++作业_静态成员

5-5

静态数据成员:

​ 是类中通过关键字static声明的成员数据,不属于类的任何一个对象而为该类的所有对象共享。

特点:

  1. 类的静态数据成员应该在代码中被显式地初始化,且一般要在类外在全局作用域中进行(除非它是常量),用::指明所属的类。

    class A{
        static int a = 3; //错误
        static const int b = 3; //正确
    
  2. 不属于单个对象而被所有该类的对象所同享,包括该类的派生类对象,由此:

    1. 静态数据成员可以作为成员函数的默认形参

      class A{
          static int a;
          void test(int i = a); //正确
      
    2. 静态数据成员的类型可以是所属类的类型

      class A{
      	static A a; //静态数据成员
      
    3. 静态数据成员在const函数中可以修改

      class A{
          static int a; int b;
          void test() const
          {
              a++; //正确
              b++; //错误
          }
      
  3. 具有静态生存期,在定义时就分配内存空间,没用任何对象时都可以访问。

  4. 外部访问类的静态数据成员能直接通过类名和::来访问,也可以使用类的对象、引用或指针来访问。


5-6

静态函数成员:

​ 是在类中加上static关键字声明成员函数。

特点:

  1. 可以在类中定义。

  2. 不属于单个对象而被所有该类的对象所同享,由此:

    1. 静态成员函数不能调用非静态成员函数和非静态数据成员,但非静态成员函数可以调用静态成员。

    2. 静态成员函数没有this指针,所以静态成员函数不能使用修饰符(函数后面的const关键字)。

      static void test() const //错误
      
    3. 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。

      class A{
          void test1();
          static void test2();
      void (B::*p1)() = &B::test1; //不能写&(B::test1)
          						//报错:lvalue required as unary '&' operand
      void (*p2)() = &B::test2; //可以写&(B::test2)
      
  3. 具有静态生存期,在定义时就分配内存空间,没用任何对象时都可以访问。

  4. 在类外调用时,可以直接通过类名和::来访问,也可以使用类的对象、引用或指针来访问。


5-7

g namespace std;

class Cat
{
private:
    static int numOfCats;

public:
    Cat()         
    {
        cout<< "Default construction"<< endl;
        numOfCats++;
    }
    Cat(Cat & ca) 
    {
        cout<< "Copy construction"<< endl;
        numOfCats++;
    }

    ~Cat()        
    {
        cout<< "Destruction"<< endl;
        numOfCats--;
    }

    static void getNumOfCats()
    {
        cout<< "The number of cats is "<< numOfCats<< endl<< endl;
    }

};
int Cat::numOfCats = 0;

int main()
{
    {
        Cat c1;
        Cat::getNumOfCats();
        Cat c2(c1);
        c2.getNumOfCats();
        Cat c3 = c1;
        Cat::getNumOfCats();
    }
    Cat::getNumOfCats();
    
    Cat* pc = new Cat;
    Cat::getNumOfCats();
    delete pc;
    Cat::getNumOfCats();
    
    cin.get();
    return 0;
}

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值