static成员

用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。
面试题:实现一个类,计算程序中创建了多少个类对象

class Count
{
public:
  Count()
  {
  	++_count;
  }
  
  Count(const Count& C)
  {
  	++_count;
  }
  
  static int GetCount()
  {
  	return _count;
  }
  
private:
  static int _count;
};
int _count = 0;

static特性:

  • 静态成员为类对象所共享,不属于某个具体的实例
  • static修饰的成员函数可以通过类名::静态成员或者对象.静态成员
  • 静态成员必须在类外定义,定义时不加static关键字
  • 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  • 静态成员和类的普通成员一样,也有public,protected,private三种访问级别,也可以具有返回值,const修饰符等参数

两个问题:
1.静态成员函数可以调用非静态成员函数吗?
在特殊情况下可以通过在静态成员函数参数列表中传递类的地址来实现对类对象的非静态成员变量进行访问和操作,如下:

class Date 
{
public:
  Date(int year = 2019,int month = 1,int day = 1)
     :_year(year)
     ,_month(month)
     ,_day(day)
  {}

  static void Print(Date* d)
  {
    d->Add();
  }

  void Add()
  {
    _year++;
    _month++;
    _day++;
  }

  friend ostream& operator<<(ostream&,const Date&);

private:
  int _year;
  int _month;
  int _day;
};

ostream& operator<<(ostream& os,const Date& d)
{
  os << d._year<<" " <<d._month <<' '<<d._day;
  return os;
}

int main()
{
  Date d;
  d.Print(&d);
  return 0;
}

2.非静态成员函数可以调用静态成员函数吗?
也可以,可以直接调用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值