静态成员是所有对象共享的,所以不能在静态方法里访问非静态的元素。
非静态方法可以访问类的静态成员,也可以访问类的非静态成员
#include <iostream>
#include <string>
class Pet
{
public:
Pet(std::string theName);
~Pet();
static int getCount();
protected:
std::string name;
private:
static int count; //count属于private成员,只有Pet类里面的方法能访问。因此编写了方法 static int getCount();
//且外部方法不能修改此值。只有上面的析构函数和构造函数能修改。
};
class Dog:public Pet
{
public:
Dog(std::string theName);
};
class Cat:public Pet
{
public:
Cat(std::string theName);
};
int Pet::count = 0; //注意,这一句 :分配静态变量的内存区域,并进行初始化,不可少。
//分配内存方法如上,即ClassName::methodName();
Pet::Pet(std::string theName)
{
name = theName;
count++;
std::cout<<"一共出生的宠物名为"<<name <<"\n";
}
Pet::~Pet() //析构,宠物死亡,计数器减
{
count--;
std::cout<<name<<"die";
}
int Pet::getCount()
{
return count;
}
Dog::Dog(std::string theName):Pet(theName)
{
}
Cat::Cat(std::string theName):Pet(theName)
{
}
int main()
{
Dog dog ("tom");
Cat cat("Jerry");
std::cout<<"诞生了宠物个数"<<Pet::getCount();
{//注意这个大括号,尝试去掉观察结果变化
Dog dog_2("Tom_2");
Cat cat_2("Jerry_2");
std::cout<<"现在已经诞生了宠物个数"<<Pet::getCount();
}
std::cout<<"还有宠物个数"<<Pet::getCount();
return 0;
}