C++中类的静态变量和静态方法的使用

/*
**静态属性和静态方法 
*/ 
#include <iostream>

using namespace std;

class Pet
{
public:
    int pubA;
    int pubB;
    Pet();
    ~Pet();
    int petCount();
    static int petCountStatic(Pet &pet);
    static int pubCount;
    
private:
    int privA;
    int privB;
    static int count;    
};

//类的静态属性在类外的初始化格式
//private下的静态属性由于只有类可以访问,因此只能在全局区域进行初始化,不能在函数内初始化
//public下的静态属性可以被外部代码访问,所以不仅可以在全局区域初始化,也可以在函数内初始化。 
//类的静态成员时属于类的,因此所有对象共享同一个静态成员的内存区域,因此某个对象修改了一次静态属性,将会影响所有对象。 
int Pet::count = 0; 
int Pet::pubCount = 0; 

class Dog : public Pet
{
public:
    Dog();
    ~Dog();
};

Dog::Dog() : Pet()
{
    //子类只能继承基类中public的属性和方法,所以不能访问基类的private中定义的属性
    //子类只能访问基类中public下的属性 
    pubCount++;
    cout << "pubCount: " << pubCount << endl;
}

Dog::~Dog()
{
    pubCount--;
    cout << "pubCount: " << pubCount << endl;
}

Pet::Pet()
{
    count++;
    cout << "count: " << count << endl;
    pubA = 0;
    pubB = 0;
    privA = 0;
    privB = 0;
}

Pet::~Pet()
{
    count--;
    cout << "count: " << count << endl;
}
 
int Pet::petCount()
{
    cout << "Now count: " << count << endl;
}

int Pet::petCountStatic(Pet &pet)
{
    //静态方法不能直接调用一般成员,可以通过对象引用实现调用 
    //因为静态方法存储在静态存储区,在调用静态方法的时候,不会隐形传递给它对象的this指针,所以它不知道需要访问的是哪个对象的成员
    //只有静态属性也存储在静态存储区,可以被静态方法直接访问 
    cout << "pubA: " << pet.pubA << ", pubB: " << pet.pubB << endl;
    cout << "privA: " << pet.privA << ", privB: " << pet.privB << endl;
    //静态方法可以直接调用静态属性 
    cout << "static count: " << count << endl;
    cout << "static pubCount: " << pubCount << endl;
} 
 
int main()
{
    //private下的静态属性由于只有类可以访问,因此只能在全局区域进行初始化,不能在函数内初始化
    //public下的静态属性可以被外部代码访问,所以不仅可以在全局区域初始化,也可以在函数内初始化。 
    Pet::pubCount = 0;
    
    Dog dog1;
    
    //一般方法只能通过类的对象进行调用 
    //子类想要访问基类中private下的属性,只能通过基类中的方法来访问。 
    dog1.petCount();
    
    //类的静态方法可以通过 类::方法 进行调用,也可以通过类的对象进行调用 
    //不推荐使用 对象名.方法 来调用一个静态方法,因为容易与普通方法混淆 
    Dog::petCountStatic(dog1);
    dog1.petCountStatic(dog1);
    
    //类的静态属性可以通过对象进行调用,也可以通过 类::属性 进行调用。
    //类的一般属性只能通过对象进行调用 
    cout << dog1.pubA << " " << dog1.pubB << " " <<dog1.pubCount <<endl;
    cout << "This is Pet pubCount : " << Pet::pubCount << endl;
    cout << "This is Dog pubCount : " << Dog::pubCount << endl;
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值