您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第21讲-静态属性和静态方法
发布时间:2021-05-17 22:42:18编辑:雪饮阅读()
静态属性,这里主要讲的是静态变量于类中,它支持以类名来直接访问,并且类的多个实例化会自动共享同一个属性值,任何对象对其的操作都会影响到其它对象读取到的该对象的变量的值。另外就是当其处于代码块中会变成局部的静态成员变量,虽然不会累加了,但是代码块最终的值会被累加到代码外原来的类的static变量中。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用
静态方法也是类的一个静态成员。
一个具体的实例如:
#include <iostream>
#include <string>
//动物类
class Pet{
public:
Pet(std::string theName);
~Pet();
static int getCount();
protected:
std::string name;
private:
static int count;
};
Pet::Pet(std::string theName){
name=theName;
count++;
std::cout<<"一只宠物出生了,名字叫做:"<<name<<"\n";
}
Pet::~Pet(){
count--;
std::cout<<name<<"挂掉了\n";
}
//静态私有属性,可以外部直接赋值,必须使用该私有类定义所在的根类
int Pet::count=0;
int Pet::getCount(){
return count;
}
//狗类
class Dog:public Pet{
public:
Dog(std::string theName);
};
Dog::Dog(std::string theName):Pet(theName){
}
//猫类
class Cat:public Pet{
public:
Cat(std::string theName);
};
Cat::Cat(std::string theName):Pet(theName){
}
int main()
{
Dog dg("Tom");
Cat ct("jerry");
std::cout<<"\n已经诞生了"<<Pet::getCount()<<"只宠物!\n\n";
{
/*
如果在代码块”{}”中定义了变量,则该变量的生存周期和作用域将被限制在该代码块内。
个人理解:成为当前代码块中的局部变量一样,所以这里即便两次实例化,但是对象实例化次数统计count还是1
*/
Dog dg_2("Tom_2");
Cat ct_2("jerry_2");
//个人理解:count两次重新初始化并自加,所以最后结果仍然是1
std::cout<<"\n现在呢,已经诞生了"<<Pet::getCount<<"只宠物!\n\n";
}
/*
个人理解:由于这里代码块中虽然是局部变量,但毕竟是静态局部变量,所以这个代码块结束之后,count的最终值得以保存下来,退出代码块后,得到保留的这个值就还给(赋值)原本外面的Pet类的count的值上面了
Pet::getCount是static修饰,所以即便在代码块内部由于作用域抛弃了全局作用域,值最终为1,但是代码块结束后tom_2和jerry_2都自减,所以就是-2,但是由于代码块最终保留值为1,那么count就是-1了,但是由于
出到代码块以后还要累加到非局部的count(值是2,此时外部的tom和jerry还没有销毁),所以这里最后值就是1了
*/
std::cout<<"\nAnd you're back to:"<<Pet::getCount<<":Pets!\n\n";
return 0;
}
其编译并运行结果如:
代码块内部的运算逻辑好像还和编译器或者操作系统环境有什么关系
因为在甲鱼的视频中这里“现在呢,已经诞生了1只宠物!”开始我和他的结果就不同了,甲鱼也就照着他的代码,随便简单的介绍了一下,这些深入的他根本就没有讲。。。。
关键字词:静态属性,静态方法
上一篇:第20讲-一种特殊的友情 友元類
下一篇:第22讲-静态属性和静态方法2
相关文章
-
无相关信息