细说C++(十三):static成员,函数

static

计算机的存储结构

(在说static的用法之前我们先来看一下计算机的存储结构,以及C++内存分布)

  • 内存(主存)

  • 硬盘

  • 高速缓存

  • 寄存器


数据
  • 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。

  • 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。

  • 自由存储区,就是那些由 malloc 等分配的内存块,它和堆是十分相似的,不过它是用 free 来结束自己的生命的。

  • 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 则没有这个区分了,他们共同占用同一块内存区。

  • 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

如下图所示:(图片来着网络)

在这里插入图片描述


在类中的用法
    1. 调用方法
      (1)通过类对象调用
      (2)通过类名调用
#include <iostream> 

using namespace std;
class Account{
	public:
		static double m_rate;    // 声明:独立于类的对象之外 
		static void set_rate(const double& x){
		      m_rate=x;
		}
	
};

double Account:: m_rate=1.0;    // 设初始化,设初值(定义:获得内存) 

int main()
{
	Account::set_rate(5.0);      //类名调用 
	cout<<Account::m_rate<<endl;
	Account a;
	a.set_rate(7.0);    // 对象调用静态成员函数,编译器将不再会在参数里添加this指针,这个隐含的操作 
	cout<<Account::m_rate<<endl;
	return 0;
}

注意点:对象调用静态成员函数,编译器将不再会在参数里添加this指针,这个隐含的操作

  • 用于修饰类的数据成员,即所谓“静态成员”。这种数据成员的生存期大于class的对象(实例/instance)。静态数据成员是每个class有一份,普通数据成员是每个instance 有一份

  • 用于修饰class的成员函数,即所谓“静态成员函数”。这种成员函数只能访问静态成员和其他静态程员函数,不能访问非静态成员和非静态成员函数(没有隐含的this指针)。


static成员
  1. static 成员不能在类体内进行初始化

错误提示如下

在这里插入图片描述

  1. static 成员不占用类对象的空间
#include <iostream>

using namespace std;

class A{
	public:
		A(){} 
		~A(){} 
	private:
		static int x;  //static int x=1;错误 
		
		static void m_data(int a)
		{  x=a;  }     
};

int A::x=1;

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

: 输出结果为1

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值