/*
我们真正需要的是一个只在创建或删除对象时候才允许访问的计数器。
这个问题必须使用 C++ 的静态属性和静态函数才能完美地得到解决。
C++ 允许我们把一个或多个成员声明为属于某个类,而不是仅属于该类的对象。
(就是说这个成员仅能让该类使用)
这么做的好处是程序员可以在没有创建任何对象的情况下调用有关的方法。
另外一个好处是能够让有关的数据仍在该类的所有对象间共享。
创建一个静态属性和静态方法:
只需要在它的声明前加上 static 保留字即可
static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。
(1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,
而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,
不能在其它文件中访问,即便是 extern 外部声明也不可以。
(3)static 修饰一个函数,则这个函数的只能在本文件中调用,
不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,
包括全局静态变量和局部静态变量,都在全局数据区分配内存。
初始化的时候自动初始化为 0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。
如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。
*/
#include <iostream>
#include <string>
class Pet
{
public:
Pet(std::string theName);
~Pet();
//接口 获取计数器
static int getCount();
protected:
std::string name;
private:
static int count;
};
class Dog : public Pet
{
public:
Dog(std::string theName);
};
class Cat : public Pet
{
public:
Cat(std::string theName);
};
int Pet::count = 0; // 注意这一句:他起码做了两件事 分配内存 初始化为0
Pet::Pet(std::string theName)
{
name = theName;
//计数器加一
count++;
std::cout << "一只宠物出生了,名字叫做: " << name << "\n";
}
Pet::~Pet()
{
//计数器减一
count--;
std::cout << name << "挂掉了\n";
}
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 << "\n已经诞生了" << Pet::getCount() << "只宠物!\n\n";
Dog dog_2("Tom_2");
Cat cat_2("Jerry_2");
std::cout << "\n现在呢,已经诞生了" << Pet::getCount() << "只宠物!\n\n";
std::cout << "\n现在还剩下 " << Pet::getCount() << " 只宠物!\n\n";
return 0;
}
静态属性和静态方法
最新推荐文章于 2021-12-26 17:46:34 发布
本文探讨了如何利用C++的静态属性和静态函数实现一个仅在对象创建和删除时改变的计数器,强调了静态成员的使用优势,如类级访问和数据共享。通过实例展示了如何声明和使用静态变量和函数,以及它们在存储方式和可见性上的特性。
摘要由CSDN通过智能技术生成