静态成员

1.关键字

static

包含:

静态变量:static int a;

静态函数:static int fun(){}

2.静态变量

1)不能通过初始化列表来初始化静态变量

#include <iostream>
#include <string>
using namespace std;

class Cperson
{
public:
	Cperson():a(12)
	{

	}

	~Cperson()
	{

	}
private:
	static int a;
};

int main()
{

	system("pause");
	return 0;
}

编译器报错:

2)只能通过类外初始化,类外初始化也不能添加static修饰符,格式为:类名::静态变量=数值;

初始化不能放在主函数中,放在类和主函数之外

可以通过类来访问静态变量,格式为:类名::静态变量;这种方法也只限于静态变量是公共成员,如果是私有成员,那么也是无效的,只能通过函数返回或者友元

私有静态变量,也是通过类外部初始化的

#include <iostream>
#include <string>
using namespace std;

class Cperson
{
public:
	Cperson():b(13)
	{

	}

	static int a;
	int b;
private:
	static int c;
};

int Cperson::a = 12;                //public静态变量初始化
int Cperson::c = 14;                //private静态变量初始化

int main()
{
	cout << Cperson::a << endl;     //正确,可以通过类作用域来访问静态变量
	//cout << Cperson::b << endl;   //错误,变量b不是静态变量
	//cout << Cperson::c << endl;   //错误,静态变量c是私有成员,外部不能访问  
	Cperson::a = 13;                //正确,可以通过类的作用域来改变静态变量的值
	//Cperson::b = 13;              //错误,变量b不是静态成员
	//Cperson::c = 13;              //错误,静态变量c是私有成员,外部不能访问

	Cperson op;
	cout << op.a << endl;           //也可以通过对象来访问静态变量

	system("pause");
	return 0;
}

 执行结果:

3)可以在类中对静态常量整型变量进行初始化:static const int a=1;

4)静态成员变量属于类的属性,而不属于对象。它是所有对象共有的一个部分。可以通过类名来访问也可以通过对象来访问

3.静态函数

1)调用方式和静态变量一样,可以通过类作用域来调用,也可以通过对象来调用

#include <iostream>
#include <string>
using namespace std;

class Cperson
{
public:

	static void fun()
	{
		cout << "I am static" << endl;
	}
};


int main()
{
	Cperson::fun();

	Cperson op;
	op.fun();

	system("pause");
	return 0;
}

执行结果:

4.注意

1)静态成员无this指针

2)不能调用类中普通成员,包括变量和函数,但可以调用静态成员

原因:

this指针在对象创建之后才会产生,静态成员跟对象没有直接的关系,它是类本身的一个属性,只有类存在,那么静态成员就存在,在内存中就有空间;居然跟对象没有联系,所以跟this指针也没有联系

#include <iostream>
#include <string>
using namespace std;

class Cperson
{
public:
	Cperson() :a(12)
	{
	}

	static void fun()
	{
		//this->a = 13;         //错误,静态函数没有this指针
		//this->b = 13;         //错误,静态函数没有this指针
		//cout << a << endl;    //错误,静态函数不能访问非静态变量
		cout << b << endl;      //正确,静态函数可以访问静态变量
		cout << "I am static" << endl;
	}
private:
	int a;
	static int b;
};

int Cperson::b = 12;

int main()
{
	Cperson::fun();

	system("pause");
	return 0;
}

执行结果:

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/81348158
今日推荐