全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++中静态成员函数与静态成员变量(static )

C++中静态成员函数与静态成员变量(static )

这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。

复习C语言的static关键字

(1)加在局部变量的前面使之成为静态局部变量,作用域还是在函数内部,可是生存周期延长了。

(2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行。这在C语言的多人项目中非常有用,避免了变量的重名。然而在C++中这一功能已经被命名空间取代,但是为了保持和C语言的兼容,static还是有这样的功能。

(3)加在函数定义或声明的前面,限定函数作用域到文件作用域,也是为了避免多个文件中有重名函数。

当static关键字出现在类中

当static出现在类的定义中便出现了静态成员变量和静态成员函数。静态成员是属于类的,而不是属于某个对象的。即便没有任何一个实例,类的静态成员变量也已经存在了,而且还可能通过“类名::成员名”进行访问。类的静态成员函数也可以用相同的方式调用,在类产生实例之前就调用成员方法,典型应用是实现单例模式。

(1)静态成员变量

静态成员变量本质上是全局变量,但是将和某些类关系紧密的全局变量写到类里面,形式上成为一个整体,更容易理解和维护。所以尽量使用静态成员变量吧,减少全局变量的使用。普通成员变量每个对象都有各自的一份,但是静态成员变量一共只有一份,被所有的本类对象共享。如果使用sizeof运算符计算对象的大小,得到的结果是不包含静态成员变量在内的。

静态成员同样受到private,public等的限制。

静态成员变量的一个典型应用就是用来计数生成的实例的个数。大体思路是设置一个名为num的静态成员变量并初始化为0,在构造函数中++num,析构函数中--num。这样num的值就是当前实例的个数。实际上这也带来了一个隐蔽的bug。看下面的代码:

class CNum {
   public:
       static int num;
       ~CNum() { --num; }
       CNum() { ++num; }
};

int CNum::num = 0;
void fun(CNum n){ }

 int main() {
   CNum n;
   fun(n);
   fun(n);
   cout << CNum::num << endl;
  return 0;
}

结果:-1

num尽然成了一个负数,难道析构函数比构造函数多调用了一次?实际上不是的。当执行 fun(n); 语句时调用了复制构造函数,这个函数因为我们没有给出实现,所以是用的编译器默认提供的版本,在这个构造函数中并没有++num这条语句,因此少计数了两次(两次调用fun(n))。

解决的方法就是一定要提供自己写的复制构造函数并在函数体中加入 ++num;

(2)静态成员函数

静态成员函数内部不能调用非静态成员函数,原因是,非静态成员函数需要传入一个this指针,这让静态成员函数很为难,它并不知道与之相关的信息,也就无法提供this指针。

静态成员变量的初始化

上面代码中的第8行  int CNum::num = 0; 是静态成员变量的初始化。这可以视为是静态变量的定义(定义的同时初始化,即便不初始化也需要这个定义),而把类内的 static int num; 视为一个声明,这样的理解可以突出这样一个事实:静态成员变量本质上是全局变量。注意在类外定义时加上“类名::”。

对于常量成员变量,我们知道初始化时一定要使用初始化列表,那么当一个变量既是常量又是静态成员时(同时被const和static修饰)要怎么样初始化呢?是像一般的静态成员变量一样在类外定义并初始化,还是像一般的常量成员变量一样使用初始化列表呢?答案时前者,即在类外定义并初始化,在类内声明,就像下面那样:

class CNum {
   public:
      const static int num;
};

const int CNum::num = 0;

 int main() {
   CNum n;
  return 0;
}

实际上,完全可以把const int 视为一种数据类型,它的地位和int一样。这样理解是有好处的,比如从const int到int需要强制类型转换,把他们看成两种类型,这就自然而然。相应的const char 和char 也应该看成两种类型,就好像它们完全没有什么特殊的关系一样。

另外static const int类型和static const char 类型可以在类内直接初始化,就是说都不需要在类外再次定义,像下面这样:

class CNum {
   public:
     const static int a = 19;
};


 int main() { 8   cout << CNum::a << endl;    //输出19
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 静态成员函数与静态成员变量(static  #   # static  # 使用方法  # 从汇编看c++中函数里面的static关键字的使用说明  # C++ static函数调用问题小结  # 全局变量  # 加在  # 是有  # 出现在  # 两次  # 本质上  # 中非  # 两种类型  # 这一  # 是在  # 都有  # 成了  # 就像  # 在这个  # 又是  # 也就  # 多个  # 可以用  # 中有  # 帮你 


相关文章: 代刷网站制作软件,别人代刷火车票靠谱吗?  宿州网站制作公司兴策,安徽省低保查询网站?  建站主机默认首页配置指南:核心功能与访问路径优化  济南网站制作的价格,历城一职专官方网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  西安专业网站制作公司有哪些,陕西省建行官方网站?  内网网站制作软件,内网的网站如何发布到外网?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  招商网站制作流程,网站招商广告语?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何将凡科建站内容保存为本地文件?  如何做网站制作流程,*游戏网站怎么搭建?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  如何快速搭建响应式可视化网站?  建站主机选购指南与交易推荐:核心配置解析  如何正确下载安装西数主机建站助手?  如何快速上传建站程序避免常见错误?  高防服务器:AI智能防御DDoS攻击与数据安全保障  家具网站制作软件,家具厂怎么跑业务?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  制作网站怎么制作,*游戏网站怎么搭建?  IOS倒计时设置UIButton标题title的抖动问题  创业网站制作流程,创业网站可靠吗?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在IIS中配置站点IP、端口及主机头?  三星网站视频制作教程下载,三星w23网页如何全屏?  如何快速搭建高效WAP手机网站吸引移动用户?  如何构建满足综合性能需求的优质建站方案?  如何快速搭建高效香港服务器网站?  建站之星安装路径如何正确选择及配置?  建站之星如何一键生成手机站?  制作农业网站的软件,比较好的农业网站推荐一下?  建站之星如何优化SEO以实现高效排名?  微信推文制作网站有哪些,怎么做微信推文,急?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  建站之星如何实现PC+手机+微信网站五合一建站?  网站微信制作软件,如何制作微信链接?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何用已有域名快速搭建网站?  一键网站制作软件,义乌购一件代发流程?  建站之星ASP如何实现CMS高效搭建与安全管理?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  为什么Go需要go mod文件_Go go mod文件作用说明  高性价比服务器租赁——企业级配置与24小时运维服务  非常酷的网站设计制作软件,酷培ai教育官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。