C++中四种对象生存期和作用域以及static的用法总结分析_C 语言

一、四种对象生存期和作用域


栈对象
隐含调用构造函数(程序中没有显式调用)

堆对象
隐含调用构造函数(程序中没有显式调用),要显式释放

全局对象、静态全局对象

全局对象的构造先于main函数

已初始化的全局变量或静态全局对象存储于.data段中

未初始化的全局变量或静态全局对象存储于.bss段中

静态局部对象

已初始化的静态局部变量存储于.data段中

未初始化的静态局部变量存储于.bss段中

复制代码 代码如下:

#include <iostream>
using namespace std;
class Test
{
public:
    Test(int n) : n_(n)
    {
        cout << "Test " << n_ << " ..." << endl;
    }
    ~Test()
    {
        cout << "~Test " << n_ << " ..." << endl;
    }
private:
    int n_;
};
int n;          // 未初始化的全局变量,初始值为0。n存储于.bss段中。(block started by symbol)
int n2 = 100;   // 已初始化的全局变量,初始值为100。n2存储于.data段中。
Test g(100);        // 全局对象的构造先于main函数
static Test g2(200);
int main(void)
{
    cout << "Entering main ..." << endl;
    Test t(10);     // 栈上创建的对象,在生存期结束的时候自动释放
    {
        Test t(20);
    }
    {
        Test *t3 = new Test(30);        // 堆上创建的对象,要显式释放
        delete t3;
    }
    {
        static int n3;          // n3存储于.bss段中      (编译期初始化)
        static int n4 = 100;    // n4存储于.data段中 (编译期初始化)
        static Test t4(333);    // t4对象运行期初始化   .data段
    }
    cout << "Exiting main ..." << endl;
}

二、static 用法总结
1. 用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,使得函数具有一定的“状态”。使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok(3)。

2. 用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。专业的说法叫“具有internal linkage”(简言之:不暴露给别的translation unit)。

C语言的这两种用法很明确,一般也不容易混淆。

由于C++引入了类,在保持与C语言兼容的同时,static关键字又有了两种新用法:
3.用于修饰类的数据成员,即所谓“静态成员”。这种数据成员的生存期大于class的对象(实例/instance)。静态数据成员是每个class有一份,普通数据成员是每个instance 有一份。

4. 用于修饰class的成员函数,即所谓“静态成员函数”。这种成员函数只能访问静态成员和其他静态成员函数,不能访问非静态成员和非静态成员函数。

时间: 2024-09-17 04:48:30

C++中四种对象生存期和作用域以及static的用法总结分析_C 语言的相关文章

C++中关于[]静态数组和new分配的动态数组的区别分析_C 语言

本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解.具体区别如下: 一.对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小: 因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度. int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(int型)占4字节. int *a=new int[4];则sizeof(a)=sizeof(*a)=4,因为

探讨C++中数组名与指针的用法比较分析_C 语言

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.但是数组名有些地方又不同于指针.这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正!(本文程序在WIN32平台下编译):1.数组名和指向那个数组的指针,地址相同,但大小不同用例子来说明: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;int _tmain(int

c++中map的基本用法和嵌套用法实例分析_C 语言

本文实例讲述了c++中map的基本用法和嵌套用法.分享给大家供大家参考.具体分析如下: C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值.本文主要总结一下map基本用法和嵌套用法示例. 一.map基本用法 1. 头文件 复制代码 代码如下: #include <map> 2. 定义 复制代码 代码如下: map<int,int> my_Map; //注意这里的int和int可以是其他类型 或者是 复制代码 代码如下: t

C++中重载、重写(覆盖)和隐藏的区别实例分析_C 语言

本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int i); void test(double i); void test(int i, double j); void te

C++中四种类型转换 const_cast是否能改变常量

we have four specific castingoperators:dynamic_cast, reinterpret_cast, static_cast and const_cast. Their format is to follow the new type enclosed between angle-brackets (<>) and immediately after, the expression to be converted between parentheses.

c++中四种强制类型转换及区别对比

C++四种强制类型 reinterpret_cast<目标类型>(原类型变量)//重解释类型转换  dynamic_cast<new_type>(expression)//动态类型转换  static_cast<new_type>(expression)//静态类型转换  const_cast<new_type>(expression)//返回一个指向非常量的指针   1.const_cast:常量指针被转化成非常量的指针,并且仍然指向原来的对象:常量引用被

Excel中四种常用类型图表的创建方法

Excel中四种常用类型图表的创建方法   上图中的四种不同类型的图表都是根据同一个表格创建的,也就是说,这四种常用的图表是没有特定的数据限制的. 一.创建柱形图 1.将光标定位到要创建图表的数据区域内,然后切换到"插入"选项卡,在"图表"组的"柱形图"下选择一种需要的柱形图类型进行创建. 2.现在工作表中已经插入了一个选择的柱形图. 二.创建条形图 1.将光标定位到表格区域内,然后选择一个合适的条形图类型进行创建. 2.现在工作表中已经插入了一

PS中四种描边方式图文介绍

  这篇教程是图文介绍PS中四种描边方式,教程比较简单,希望对大家有所帮助! 教程结束,以上就是PS中四种描边方式图文介绍,希望对大家有所帮助! 分类: PS入门教程

Java中四种XML解析技术之不完全测试

xml 在平时工作中,难免会遇到把XML作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历XML这块来测试,因为遍历XML是工作中使用最多的(至少我认为). 预备 测试环境: AMD毒龙1.4G OC 1.5G.256M DDR333.Windows2000 Server SP4.Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在Debug模式下测试. XML文件格式如下: <?xml ver