c++中类的静态成员对象

在c++中,可以声明一个静态的成员对象,但是此时仅仅声明,没有定义,也不会创建这个内部的静态成员对象。只有在类体外部定以后才能创建这个对象。

 1 #include<iostream>
 2 using std::cout;
 3 using std::endl;
 4 class Outer{
 5     class inner{
 6     public:
 7         inner(){
 8             cout << "inner()" << endl;
 9         }
10         ~inner(){
11             cout << "~inner()" << endl;
12         }
13
14     };
15     static inner m_inn;
16 public:
17
18     Outer(){
19         cout << "Outer()" << endl;
20     }
21     ~Outer(){
22         cout << "~Outer()" << endl;
23     }
24 };
25
26 int main(){
27     Outer o1;
28     return 0;
29
30 }

上述代码中,我们并没有对成员对象进行定义,仅仅是引用性声明,此时并不会为其分配空间。运行结果如下

我们看到运行结果展示,inner的构造函数与析构函数都没有被调用,说明并没有创建inner的对象m_inn;

此时我们在类体外部对m_inn进行定义

代码如下

 1 #include<iostream>
 2 using std::cout;
 3 using std::endl;
 4 class Outer{
 5     class inner{
 6     public:
 7         inner(){
 8             cout << "inner()" << endl;
 9         }
10         ~inner(){
11             cout << "~inner()" << endl;
12         }
13
14     };
15     static inner m_inn;
16 public:
17
18     Outer(){
19         cout << "Outer()" << endl;
20     }
21     ~Outer(){
22         cout << "~Outer()" << endl;
23     }
24 };
25 Outer::inner Outer::m_inn;//对m_inn进行定义。
26 int main(){
27     Outer o1;
28     return 0;
29
30 }

此时的运行结果表明,m_inn被创建了。所以如果类内部有静态成员对象,一定要在类体外部进行定义

时间: 2024-10-22 21:54:07

c++中类的静态成员对象的相关文章

java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解

一.描述 java中类的静态代码块.构造代码块.构造方法.静态成员的初始化顺序: 首先,在类加载时,为类中的静态成员变量分配内存空间,并为其赋予默认值(整数型为0,浮点型为0.0,布尔型为false,字符型为'\u0000',引用型为null): 其次,执行静态成员变量的显式初始化操作.静态成员的初始化方法有两种,其一为在声明的时候直接初始化,其二为使用静态代码块进行初始化, 这两种初始化方式会按照在类中的出现顺序来执行,而且只在类加载的时候执行一次. 再次,如果创建了类的对象,便会在堆中为类的

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

c++中类的静态数据成员

有时需要为某个类的所有对象分配一个单一的存储空间,这个存储空间只是被这个类的对象访问,其他人不能访问,那么这时静态的成员变量是有用的.例如下面用来统计一共创建了多少个对象的变量num class classVar{ static int num; public: classVar(){num++;} ~classVar(){num--;} int getNum(){return num;} }; int object::num = 0; int main(){ classVar var1; {

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

C++ 静态对象

一:什么是静态对象? 对象的存储方式是静态的. 局部静态对象和类的静态对象. 局部静态对象:一个变量在函数内部定义,其生命周期跨越了该函数的多次调用.局部对象确保不迟于在程序执行流第一次经过该对象的定义语句时进行初始化.这样的对象一旦被创建,在程序结束之前都不会销毁.在定义局部静态对象的函数执行完毕后,该静态对象不会撤销.当该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. 静态成员对象:静态成员对象存储在全局存储区,静态成员对象的作用域在类的作用域中.其可以避免与其他类成员或全局对

【转】UML的9种图例解析

UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法). 3) 类的属性即类的数据职责,类的操作即类的行为职责 一.依赖关系(Dependence) 依

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

-Java基础-对象

1.创建对象(实例) new关键字 既然类是对象的模板,new 类名();就是创建一个对象的意思.New一次就创建一个对象,创建对象换个话说就是创建一遍内存.new几次就创建几个对象. 例如: //这是一个学生类 public class Student { String name; String address; int age; String sex; void dushu() { System.out.println("正在读书..."); } void lianxi() { S

医疗管理系统需求说明书

1)软件需求说明书 1.引言 1.1编写目的 本需求说明书是为医疗管理系统而编写的.多角度对产品特点进行描述,反映功能.本报告旨在使需求者明确医疗管理系统的要求和细节,给开发人员了解需求实现的难度和困难,最终提供给管理者讨论和审核,达到沟通效果. 1.2背景 随着科学技术的发展,人们的物质水平和精神水平也得到普遍提高.使医院的工作人员.病人流量及工作范畴等有了显著增加,这间接的对管理机制提出了更高的要求.医疗管理系统实现对医院业务的有效管理,减少了员工的工作流程.从而使得医院的现代化管理相比以往