静态属性和静态方法:
1、C++允许我们把一个或多个成员声明为属于某个类,而不是仅仅属于该类的对象;这么做的好处是程序员可以在没有创建任何对象的情况下调用有关的方法;另外一个好处是能够让有关的数据在该类的所有对象间共享;
2、创建一个静态属性和静态方法,只需要在它的声明前加上static保留字即可;
3、对于静态属性,在类中声明的同时,需要同时在类的外面额外定义并初始化该属性对应的内存;
Type<int> Class::StaticAttr = 0;
4、静态方法的实现中,只能使用静态属性,不能使用非静态属性;因为非静态属性在创建对象的时候才会分配内存,而静态方法不用创建对象就可以由类直接调用;
5、静态方法可以由类直接调用,也可以由类的对象进行调用;非静态方法(普通方法)只能由类的对象进行调用;
6、静态方法也可以由对象来调用,但不建议那么做,因为那会让代码变得更糟糕;
类别
|
非静态方法(普通方法)
|
静态方法
|
类调用
| 不允许 |
Class::StaticMethod();
|
对象调用
| Object.Method(); |
Object.StaticMethod();
不建议使用
|
7、静态成员是所有对象共享的,所以不能在静态方法里访问非静态属性;
8、非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
9、this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在对象的地址;
10、当一个对象被创建时,该对象的this指针就自动指向对象数据的首地址;
11、每当我们调用一个方法的时候,this指针都会随着提供的输入参数被秘密地传递给那个方法;正是因为如此,我们才能在方法里像使用一个局部变量那样使用this指针;
12、静态方法不是属于某个特定的对象,而是由全体对象共享的,这就意味着他们无法访问this指针,因为this指针是指向对象的。
示例:静态属性和静态方法
#include <iostream>
#include <string>
class Pet
{
public:
Pet(std::string theName);
~Pet();
static int getCount();
protected:
std::string name;
private:
static int count; // 申明静态变量
};
int Pet::count = 0; // 静态变量需要对应的存储空间
class Dog : public Pet
{
public:
Dog(std::string theName);
};
class Cat : public Pet
{
public:
Cat(std::string theName);
};
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;
}
输出:
一只宠物出生了,名字叫做: Tom
一只宠物出生了,名字叫做: Jerry
已经诞生了2只宠物!
一只宠物出生了,名字叫做: Tom_2
一只宠物出生了,名字叫做: Jerry_2
现在呢,已经诞生了4只宠物!
Jerry_2挂掉了
Tom_2挂掉了
现在还剩下 2 只宠物!
Jerry挂掉了
Tom挂掉了