知识点 - static数据成员及成员函数

本文详细解释了C++中静态成员的概念,包括静态数据成员和静态成员函数的特点及使用方式,并对比了面向对象与面向过程中的static关键字的不同含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

class Box
{
public:
	Box(int, int);
	
	int a;
	int b;

	int show() { return ist; }
	static int show2() { return ist; }
//	static int show3() { return a; }
//private:
	static int ist;
};

Box::Box(int ia, int ib)
{
	a = ia;
	b = ib;
}

int Box::ist = 1;

int main()
{
	Box b(11, 12), c(22, 23);
	cout << b.show() << endl;
	cout << b.show2() << endl;
	cout << b.a << endl;
//	cout << Box::ist << endl;
//	cout << b.ist << endl;
//	cout << c.ist << endl;

	return 0;
}

静态数据成员

属于类而非每个类对象,为类对象共享


定义类而未定义对象时,一般的数据成员不分配空间,只有在定义对象时才分配。

static数据成员在所有对象之外单独分配空间。即使不定义对象,也会分配空间。


在程序编译时被分配空间,到程序结束时才释放空间。


只能在类体外进行初始化。可以这样理解;它为所有类对象共享,因此不能随每个类对象初始化而初始化。

不能使用参数初始化列表对其初始化

若未赋初值,编译器会自动赋值0。

例外:const static

只要初始化式是一个常量表达式,整型const static 数据成员就可以在类的定义体中进行初始化。在类内部提供初始化式时,成员的定义不必再指定初始值。(C++Primer 第四版中文版第401页)
也就是说当使用const static时,可以在定义体中初始化,但任然需要在定义体之外进行定义


可以通过类来引用,也可通过对象来引用

如:cout << Box::ist << endl;
cout << b.ist << endl;

静态成员函数

作用是为了处理静态数据成员。


调用一个对象的成员函数(非static)时,系统会把该对象的起始地址赋值给成员函数的this指针。

静态成员函数并不属于某一个对象,没有this指针。

既然他无法指向某一对象,就无法对一个对象中的非static成员进行默认访问(即在引用数据成员时不指定对象名)。

static成员函数无法访问类中非static数据成员

如果非要引用类的非static数据成员,应该使用对象+成员运算符“."

如;cout << b.a << endl;


以上是面向对象中的static

************************************************************************

以下是面向过程的static


1)static变量

未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);

静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;

静态变量都在全局数据区分配内存,包括后面将要提到的静态 局部变量。对于一个完整的程序,在内存中的分布情况如下图:
代码区 //low address
全局数据区
堆区
栈区 //high address
一般程序把 新产生的动态数据存放在堆区函数内部的自动变量存放在栈区
自动变量一般会随着函数的退出而释放空间, 静态数据(即使是函数内部的静 态局部变量)也存放在全局数据区
全局数据区的数据并不会因为函数的退出而释放空间。
2)static函数

在函数的返回类型前加上static关键字,函数即被定义为静态函数静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

定义 静态函数的好处:
静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值