c++static成员

static数据成员

  • static成员不属于对象,属于类,是所有对象共有的--->调用可以不需要对象(当然也可以用对象调用)

  • static成员依旧受权限限定 (public、protected、private)

  • 用static修饰的数据成员,必须在类外初始化

在类中直接初始化是错误的--->不能采用初始化参数列表方式初始化,和普通数据成员写法的区别

class MM
{
public:
	MM(string name=""):name(name),num(num){} 
protected:                   /*报错:num不是类MM的非静态数据成员或基类*/  
	string name;
	static int num=0;        //报错:带有类内初始值设定项的成员必须为常量
};

static成员在类外初始化不再需要static修饰,但是受权限限定,定义变量写在protected属性会报错

class MM
{
public:
	MM(string name=""):name(name){}
	static int num;
protected:
	string name;
};
//必须在类外初始化,此时不再需要static修饰,但是需要类名限定
int MM::num = 1;
int main()
{
//静态数据成员访问,可以不需要对象--->但是需要类名限定
	cout <<MM::num << endl;

}

 什么叫做共有?深刻认识共有的概念--->所有对象用的都是用一份

class MM
{
public:
	MM(string name = "") :name(name)
	{
		num++;                  //对static成员++
	}
	static int num;
protected:
	string name;

};
int MM::num = 1;
int main()
{
//理解什么叫做共有的
	MM mm("mm");                 //2
//静态数据成员通过对象的方式去访问
	cout << mm.num << endl;      //此时num==2
	MM array[3];			     //5
	MM* p = new MM("newMM");	 //6
	cout << MM::num << endl;
	cout << p->num << endl;
	cout << mm.num << endl;
	delete p;
	p = nullptr;

}
/*输出*/

2
6
6
6

static成员函数

  • static写在函数前面即可

  • 调用非静态数据成员 必须要指定对象

小知识:

  • 没有static构造函数

  • 可以在类中声明,在类外实现/在类中实现,不需要static修饰词,需要类名限定      

怎么调用非静态数据成员--->必须指定对象

静态函数调用静态数据没有要求

class MM
{
public:
	MM(string name=""):name(name) 
	{
		num++;
	}
	static void printMM();
	static void printData(MM& mm)    //调用非静态成员--->指定一个对象进来,就可以调用了
	{
	    cout << mm.name <<" "<<num <<endl;//静态数据可以用对象指定,也可以不用对象指定

	}
protected:
	string name;
public:
	static int num;
};

int MM::num = 1;

void MM::printMM() 
{
	/*报错:调用非静态数据成员,必须要指定对象--->否则不知道这个属性属于哪个对象,传 
      对象或者定义对象的方式,printMM()这个函数不采用对象去调用,name就没有来源*/
	cout << name << endl;  
    //静态函数调用静态数据没什么要求
	cout << num << endl;
	cout << "静态成员函数" << endl;
}
int main() 
{   
    
//调用静态成员函数--->不需要对象
	MM::printMM();
//调用静态成员函数--->通过创建一个对象的方式调用
    MM mm("mm");
	mm.printMM();
//调用静态成员函数--->通过传参的方式(传入对象的参数)调用
	MM::printData(mm);
	return 0;
}
/*输出*/

1
静态成员函数
2
静态成员函数
mm   2    

static对象

生命周期到程序关闭--->最后释放

相关内容可以看看这篇博客:c++构造、析构顺序问题_考拉爱睡觉鸭~的博客-CSDN博客

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值