C++的static成员(静态数据成员)

目录

一、静态数据成员的特点

二、静态数据成员的作用

三、静态成员变量⼀定要在类外进行初始化

四、静态成员变量不存在对象中

五、静态成员函数没有【this】指针 

六、静态成员的访问方式

七、静态成员变量不能在声明位置给缺省值初始化 


一、静态数据成员的特点

【static】类成员的特点:

  1. 静态成员变量⼀定要在类外进行初始化
  2. 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区
  3. ⽤【static】修饰的成员函数,称之为静态成员函数,静态成员函数没有【this】指针
  4. 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的
  5. 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
  6. 静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制
  7. 静态成员变量不能在声明位置给缺省值初始化
  8. 突破类域就可以访问静态成员,可以通过(【类名】::【静态成员】) 或者 (【对象】.【静态成员】) 来访问静态成员变量和静态成员函数

二、静态数据成员的作用

  •  静态数据成员在类的所有对象中共享一份存储空间,而不是每个对象都拥有一份独立的拷贝
  • 也就是说,无论创建了多少个类的对象,静态数据成员都只有一份拷贝
  • 静态成员在C++编程中非常有用,尤其是在需要跨多个对象共享数据或功能时

典型应用场景

  • 计数器:用于跟踪类的实例数量
  • 工厂函数:用于创建类的实例,通常作为静态成员函数实现
  • 全局配置:用于存储类的全局配置信息,例如默认设置等

 

三、静态成员变量⼀定要在类外进行初始化

        示例:

class Test
{
public:
	
private:
	//类中声明
	static int num;
};

//静态成员变量⼀定要在类外进行初始化
int Test::num = 100;

int main()
{
    return 0;
}

         静态成员变量不可以在局部函数进行初始化,比如说在【main】函数中:

class Test
{
public:

private:
	//类中声明
	static int num;
};

int main()
{
	//静态成员变量不可以在局部函数进行初始化
	int Test::num = 100;
	return 0;
}

        会报错: 

四、静态成员变量不存在对象中

        这个很好理解【static】关键字改变了类成员的生命周期,不存在对象中,存放在静态区

        证明:

  • 如果【static】修饰的成员变量存放在类中那么以下【Test】类的大小应该为4
  • 如果【static】修饰的成员变量不存放在类中那么以下【Test】类的大小应该为1
class Test
{
public:

private:
	//类中声明
	static int num;
};

int main()
{
	cout << sizeof(Test) << endl;
	return 0;
}

        结果:

五、静态成员函数没有【this】指针 

        成员函数被【static】修饰它们本身已经与类本身关联,而不是与类创建的对象关联,因此不需要【this】指针

        静态成员函数只能访问类中的静态成员变量

        普通的成员函数会默认的传递【this】指针,再进行访问成员变量时编译器都会默认加上【this】指针来访问

        日常书写:

class Test
{
public:
	void print()
	{
		cout << num << endl;
	}
private:
	int num;
};

        实际显示: 

class Test
{
public:
	//编译器会默认的加上【this】指针
	void print()
	{
		cout << this->num << endl;
	}
private:
	int num;
};

        因此静态成员函数不可以访问类中非静态成员,因为没有【this】指针 

        示例:

class Test
{
public:
	static void print()
	{
		cout << num << endl;
	}
private:
	int num;
};

         结果:编译报错

六、静态成员的访问方式

突破类域就可以访问静态成员

  • 【类名】::【静态成员】
  • 【对象】.【静态成员】

【注意】

        静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制

        示例: 

class Test
{
public:
    //声明
	static int num;
};
//定义
int Test::num = 100;
int main() 
{
	Test t;
	//【对象】.【静态成员】
	cout << t.num << endl;
	//【类名】::【静态成员】
	cout << Test::num << endl;
	return 0;
}

        结果:

        示例:静态成员也是类的成员,受【public】、【protected】、【private】 访问限定符的限制

class Test
{
public:
private:
	static int num;
};
int Test::num = 100;
int main()
{
	Test t;
	//【对象】.【静态成员】
	cout << t.num << endl;
	//【类名】::【静态成员】
	cout << Test::num << endl;
	return 0;
}

        结果:编译报错 

七、静态成员变量不能在声明位置给缺省值初始化 

        首先我们要理解:声明位置给缺省值的本质是给初始化列表传参

        我们的静态成员变量的已经不在对象中存储了,缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表

        示例:

class Test
{
public:

private:
	//静态成员变量不能在声明位置给缺省值初始化 
	static int num = 100;
};

        结果:编译报错 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值