C/C++中static关键字的基本用法

**

static关键字

  • 1.修饰成员变量
  • 2.修饰成员方法
  • 3.静态函数
  • 4.静态全局变量
  • 5.静态局部变量

1.修饰成员变量

1)静态成员变量的初始化必须放在类外
2)静态成员变量不属于某个对象,而是属于整个类,在对象之间共享。计算每 个对象的内存空间时,不算上静态成员变量
3)可以通过类名访问静态成员变量

class A
{
    
    
public:
	A(int ab)
	{
    
    
		this->m_ab = ab;
	}

	static int m_aa;
	int m_ab;
};

int A::m_aa = 10;   //静态成员变量的初始化必须放在类外


int main()
{
    
    
	A a(10);
	A::m_aa += 10;   //可以通过类名访问静态成员变量
	a.m_ab++;
	cout << "aa: " << a.m_aa << "\tab: " << a.m_ab << endl;   //计算每个对象的内存空间时,不算上静态成员变量
	cout << "sizeof class A:  " << sizeof(A) << endl;
	
}

上面代码得执行效果
在这里插入图片描述

//2.修饰成员方法(函数)

1)静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
2)非静态成员函数可以任意地访问静态成员函数和静态数据成员;
3)静态成员函数不能访问非静态成员函数和非静态数据成员;
4)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数, 也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)
5)与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,它为类的全部服务而不是为某一个类的具体对象服务,所以不能用this指针。

class A
{
    
    
	A(int b, char c)
	{
    
    
		this->m_b = b;
		this->m_c = c;
	}

	//3.静态成员函数不能访问非静态成员函数和非静态数据成员;
	static void GetVal(void)
	{
    
    
		cout << m_a << endl;
		//cout << m_c << endl;    //报错 :非静态成员引用必须与特定对象相对	
		//this->...                 //报错: this只能用于非静态函数内部
	}
	//2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
	void getval(void)
	{
    
    
		cout << "m_a: " << m_a << "\tm_b: " << m_b << "\tm_c: " << m_c << endl;
	}
private:
	static int m_a;
	int m_b;
	char m_c;
};

 int A::m_a = 100;      //对静态成员初始化


3.静态函数

static void Stringprintf(string str)   //用来表示不能被其它文件访问的函数
{
    
    
	cout << str << endl;
}

//4.静态全局变量

static string name = "gentle";     //用来表示不能被其它文件访问的全局变量

5.静态局部变量

static局部变量的“记忆性”与生存期的“全局性”

//记忆性:两次函数调用时,在第二次调用进入时,能保持第一次调用退出时的值。
void stafunc()
{
    
    
	static int stanum = 0;  //只有第一次进入该函数才会初始化
	stanum++;
	cout << "stanum: " << stanum << endl;
		
}

void func()
{
    
    
	int num = 0;
	num++;
	cout << "num: " << num << endl;
}


int main()
{
    
    
	for (int i = 0;i < 10;i++)
	{
    
    
		stafunc();
		func();     //静态局部变量的函数和普通函数的对比
	}
	return 0;
}

上述代码得执行效果,如下图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50188452/article/details/110940196