(c++)静态属性和静态方法

内容主要总结自 https://blog.csdn.net/Chroniccandy/article/details/108621102

静态属性和静态方法
  • 类级别:静态成员会被类的所有对象共享
  • 不能在静态方法里面访问非静态元素但非静态方法可以访问类的静态成员及非静态成员
  • 静态成员不会随着实例化新的对象而被初始化
  • 坚决不建议在非必要的时候声明全局变量,我们真正需要的是一个只有在创建或删除对象时候才允许访问的计数器
  • 没有创建任何对象的情况下可以调用类的静态方法 而且该类的静态数据仍能在该类的所有对象(静态和非静态皆可)之间共享

静态成员数据
  • 类的静态数据成员在类内只能声明,定义和初始化必须在类外, C++规定不可在类体内进行赋值,真正要为它们分配内存并进行初始化的时候,需要在类外进行声明
class A{  
private:
    static int count ; //类内声明一个static类的静态数据成员
};
int A::count = 0 ; //类外初始化静态数据,类外定义时不必再加static关键字
  • 静态成员属于整个类,而不属于某个对象
  • 类的静态常量成员(static const member)可以在类内声明并初始化
class A{  
private:
    static const int count = 0;//🌟静态常量成员可以在类内初始化
};
  • const数据成员不能在类内定义时初始化,在类外初始化也不行,其通常通过构造函数初始化.
    static数据成员不能在类内初始化,其需要在类外初始化,因为static成员不属于任何一个对象.
    static const数据成员可以在类内声明且同时进行初始化,但一般仅仅限于初始化整形参数.
  • 静态数据成员被类的所有对象共享,包括该类的派生类对象。
  • 静态数据成员可以成为成员函数的可选参数,而普通数据成员不可以
  • 静态数据成员的类型可以为本类的类型,而普通数据成员不可以

静态成员函数
  • 类的静态成员函数可以在没有定义任何对象前使用,即无须创建任何对象实例就可以使用此成员函数
class A{  
public:  
    static void B(); //建立一个静态成员函数
}  
A::B();//正确访问静态成员函数的方式 格式为classname::funcname();
  • 静态成员函数不可调用类的非静态成员,且静态成员函数不包含this指针,非静态成员必须与特定对象相对
  • 静态成员函数可以在类内定义,也可以在类外定义,类外实现时候无须加static关键字

总结
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员,静态成员函数不能访问非静态成员函数和非静态数据成员。
  • 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数
要求 用户不可访问宠物的名字和宠物数量 且宠物数量为全局变量
#include <iostream>
#include <string>

using namespace std;

class Pe{
public:
	Pet(string name);//构造函数
	~Pet();//析构函数

	static int getcount();//todo访问权限为public的对象计数器函数(接口函数 对象可以访问 并可以不建立对象进行全局访问)
	//---------------------------------------------------
	//static int para;
	//void fun(int i = para); //todo静态数据成员可以成为成员函数的可选参数,而普通成员不可以

	//static Pet type;//todo静态数据成员的类型可以是本类的类型,而普通数据成员则不可以
	//Pet * a;//正确
	//Pet& b;//正确
	//---------------------------------------------------

protected:
	string thename;//todo建立存放宠物名的参数thename 访问权限为protected(对象不可访问) 目的是防止用户不慎修改该参数 所以这个参数的赋值发生在本类的结构体中(即每次有对象建立便类内部进行赋值)

private:
	static int count;//todo访问权限为private的计数值 只能本类中访问(对象不可访问)目的是防止用户不慎修改该参数 所以这个参数的赋值发生在本类的结构体中(即每次有对象建立便类内部进行赋值)
	//todo定义类的静态成员变量
};

class Dog :public Pet{
public:
	Dog(string name);
};

class Cat :public Pet{
public:
	Cat(string name);
};


int Pet::count = 0;//todo类中的静态变量count 可以全局使用

Pet::Pet(string name){
//todo构造函数 用于宠物数量的计数和宠物信息的显示 每次为类建立实例后都将被调用一次
	thename = name;
	count++;
	cout << "一只小宠物出生啦!名字叫做:" << thename << endl;
}

Pet::~Pet(){//todo析构函数 在程序尾部或对象寿命结束时被调用
	count--;
	cout << thename << "挂掉了" << endl;
}

Dog::Dog(string name) :Pet(name){
}

Cat::Cat(string name) : Pet(name){
}

int Pet::getcount(){
	return count;
}

int main(){
	Dog dog("wangcai");

	Cat cat("miaomiao");
	cout << "\n已经诞生了" << Pet::getcount() << "只宠物\n\n";
	//todo以上这个静态函数就可以在未声明任何对象的情况下 使用classname::staticfunname的格式进行 类内函数的调用
	//最大程度上规避了用户不小心修改count这个宠物数量变量的漏洞 因为这个静态函数中的count变量为private私有 仅能被Pet类内函数调用

	//todo大括号建立区域  
	{
		Dog dog2("tom");
		Cat cat2("jerry");
		cout << "\n现在呢,已经诞生了" << Pet::getcount() << "只宠物!\n\n";
	}//todo大括号建立了区域后dog2和cat2的作用域仅存在于括号内 出了括号则进行析构也就是进行~pet() 从而导致宠物死亡
	cout << "\n现在还有" << Pet::getcount() << "只宠物\n";
}

感谢大佬,此篇记录一下

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值