C++的static关键字

static关键字可以用于修改局部变量,函数,类的数据成员以及对象。静态局部变量只初始化一次,然后在每次函数调用时都保持它的值。静态成员函数可以直接用类来调用,不需要创建对象来调用。同时,C++也支持静态对象。

C++的静态对象(static object)

当使用static关键字声明一个对象时,此对象就变成了静态对象。见下面两个表达式。

Test t;                // 栈上的对象
static Test t1;     // 静态对象

第一个表达式会在栈上分配一个对象。也被称为自动对象或局部对象。局部对象在每次声明它时就会创建。而静态对象只初始化一次,并且在整个程序的生命周期中都存在。

静态对象保存在静态存储区。在程序结束时,它就会被销毁。C++既支持局部静态对象,也支持全局静态对象。
下面例子演示了局部静态对象的使用:

[cpp] view plaincopy print?
  1. #include <iostream>
  2. class Test
  3. {
  4. public:
  5. Test()
  6. {
  7. std::cout << "Constructor is executed\n";
  8. }
  9. ~Test()
  10. {
  11. std::cout << "Destructor is executed\n";
  12. }
  13. };
  14. void myfunc()
  15. {
  16. static Test obj;
  17. } // 函数结束时,obj不会被消耗,因为是静态对象。
  18. int main()
  19. {
  20. std::cout << "main() starts\n";
  21. myfunc();    // 这里不会调用析构函数,因为函数体中分配的是静态对象。
  22. std::cout << "main() terminates\n";
  23. return 0;
  24. }
#include <iostream>
class Test
{
public:Test(){std::cout << "Constructor is executed\n";}~Test(){std::cout << "Destructor is executed\n";}
};
void myfunc()
{static Test obj;
} // 函数结束时,obj不会被消耗,因为是静态对象。int main()
{std::cout << "main() starts\n";myfunc();    // 这里不会调用析构函数,因为函数体中分配的是静态对象。std::cout << "main() terminates\n";return 0;
}

输出:

main() starts
Constructor is executed
main() terminates
Destructor is executed

从结果可以看到,只有在主函数main()结束时,才会调用到析构函数。

如果删除掉上面程序中的关键字static,则会得到下面结果:

main() starts
Constructor is called
Destructor is called
main() terminates

全局静态对象

参考下面例子:

[cpp] view plaincopy print?
  1. #include <iostream>
  2. class Test
  3. {
  4. public:
  5. int a;
  6. Test()
  7. {
  8. a = 10;
  9. std::cout << "Constructor is executed\n";
  10. }
  11. ~Test()
  12. {
  13. std::cout << "Destructor is executed\n";
  14. }
  15. };
  16. static Test obj;
  17. int main()
  18. {
  19. std::cout << "main() starts\n";
  20. std::cout << obj.a; //注意:静态对象可以调用它的所有成员,包括非静态成员。
  21. //但如果是静态函数,则只能调用静态成员。
  22. std::cout << "\nmain() terminates\n";
  23. return 0;
  24. }
#include <iostream>
class Test
{
public:int a;Test(){a = 10;std::cout << "Constructor is executed\n";}~Test(){std::cout << "Destructor is executed\n";}
};
static Test obj;
int main()
{std::cout << "main() starts\n";std::cout << obj.a; //注意:静态对象可以调用它的所有成员,包括非静态成员。//但如果是静态函数,则只能调用静态成员。std::cout << "\nmain() terminates\n";return 0;
}

输出:

Constructor is executed
main() starts
10
main() terminates
Destructor is executed

C++构造与析构(18) - 静态对象(static object)何时销毁相关推荐

  1. C++系列总结——构造与析构

    前言 在使用资源前,我们需要做一些准备工作保证资源能正常使用,在使用完资源后,我们需要做一些扫尾工作保证资源没有泄露,这就是构造与析构了,这和编程语言是无关的,而是使用资源的一种方式.C++只不过是把 ...

  2. qt -- Q_GLOBAL_STATIC创建全局静态对象

    创建一个全局静态对象,类型为QGlobalStatic,名称为VariableName,行为像一个指向type的指针. Q_GLOBAL_STATIC创建的对象在第一次使用时初始化自己,这意味着它不会 ...

  3. 声明及赋值_重述《Effective C++》二——构造、析构、赋值运算

    关于本专栏,请看为什么写这个专栏.如果你想阅读带有条款目录的文章,欢迎访问我的主页. 构造和析构一方面是对象的诞生和终结:另一方面,它们也意味着资源的开辟和归还.这些操作犯错误会导致深远的后果--你需 ...

  4. C++之全局对象、局部对象、静态对象详解

    1. 对于全局对象,程序一开始,其构造函数就先被执行(比程序进入点更早):程序即将结束前其析构函数将被执行. 2. 对于局部对象,当对象诞生时,其构造函数被执行:当程序流程将离开该对象的声明周期时,其 ...

  5. C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配

    一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...

  6. 【设计原则和建议】 构造和析构对象

    良好的构造和析构对象,控制对象生命周期可以较大的提高程序的性能,降低GC的压力,减少BUG几率. 本文还是比较简单的,主要还是经验的总结,很多东西也许各位已经知道,也许不知道.希望大家一起讨论. 1. ...

  7. 《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造

    本节书摘来自异步社区出版社<C++编程惯用法--高级程序员常用方法和技巧>一书中的第2章,第2.9节,作者: [美]Robert B. Murray ,更多章节内容可以访问云栖社区&quo ...

  8. 2020-12-14(全局/静态对象的构造函数和析构函数调用的时机以及地址)

    一般的对象实例化在什么时候实例化的呢? 是不是在main函数运行到那里的时候,然后创建对象,会调用类里面的构造函数. 那当我们遇到全局/静态对象的时候,它是不是也是需要在main函数里面慢慢构造呢? ...

  9. 【No.7 C++对象的构造与析构时间】

    ==[注意]== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度 本帖属不定时连载贴,以试卷的形式 ...

最新文章

  1. 合肥工业大学—SQL Server数据库实验五:创建和删除索引
  2. Ubuntu14.04 YouCompleteMe Configure
  3. PADS 9.5安装教程附安装包资源
  4. 用java雷电游戏_Java实现仿雷电游戏
  5. java 程序实现对图片的压缩生成缩略图并可设定长宽、尺寸压缩率、图片质量
  6. linux下根据端口查进程,linux根据进程查端口,根据端口查进程
  7. JeecgBoot 3.1.0 版本发布,基于代码生成器的企业级低代码平台
  8. 2021年四川省政府工作报告:促进5G、大数据、区块链等技术与传统产业融合发展
  9. 复习了C++前几章,做一个ASCII码转换的小程序
  10. 初高级分析师的能力和工具体系,指标雷达图!
  11. python遍历文件夹以及排序问题
  12. 华为计算机黑屏怎么办,华为笔记本升级后黑屏怎么回事
  13. android双屏不同apk,双屏可折叠 通吃.exe和.apk 微软终于发大招了!
  14. 【C语言】fwrite 写如0X0A时,自动添加0X0D的解决方法
  15. 【测绘程序设计试题集】 试题04 最短路径计算
  16. DjangoUeditor添加与配置
  17. html只选择年份,原生jQuery实现只显示年份下拉框
  18. 机器人学习NO2.导航和路径规划
  19. 安装sql server 2000时又出现:安装程序配置服务器失败。参考服务器错误日志和 C:/WINNT/sqlstp.log 了解更多信息。
  20. python爬虫处理js混淆加密_Python爬虫—破解JS加密的Cookie

热门文章

  1. android百分比布局适配,安卓屏幕适配-百分比布局
  2. Android实战——第三方服务之Bmob后端云的推送服务的集成和使用(三)
  3. 手动创建DataTable并绑定gridview
  4. jquery-懒加载技术(简称lazyload)
  5. css3的新特性transform,transition,animation
  6. js实现新闻滚动-单行滚动或者多行滚动
  7. UVA-806 Spatial Structures (四分树)
  8. Android数据保存之SharedPreference
  9. 网络字节与主机字节转换 htons(), ntohl(), ntohs(),htons() 函数
  10. 《剑指offer》第四题(二维数组中的查找)