`
lc52520
  • 浏览: 362049 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

为什么static数据成员一定要在类外初始化?

阅读更多
为什么static数据成员一定要在类外初始化?
1.避免重复定义和初始化

<<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法。

但,为什么static const int就可以在类里面初始化呢?

想起C中一个函数里定义一个static变量是为了保证只初始化一次。

那么,是否可以这样理解:

static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。

static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。

而且,<<c++ primer>>说static const int也必须在类外定义,类里面的只是声明和初始化(但是linux下用GCC试的结果是:不用在类外定义也完全可以,gcc version 3.4.6)。

2.满足C++的static语意

这里的语意,应该就是1中说的意思了吧

只有const没有static的话,类的每个object都有这个const变量,也不能在类的数据成员声明的时候一起初始化了,只能在构造函数的初始化列表里初始化。

//下面是网上看到的内容:

+++++++++++++++++++++++++

#include   <iostream.h>

class   CDummy
{
public:
        static   int   n; //这里只是声明
};

int   CDummy::n=9; //这里是定义加初始化

void   main()
{
        cout < <CDummy::n < <endl;
}

上面这样完全没问题,但是不能直接在类中初始化,比如:

static   int   n=9;

+++++++++++++++++++

为什么static成员一定要在类外初始化?

        这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside   The   C++   Object   Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗?

            所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!
分享到:
评论

相关推荐

    C++类的静态成员初始化详细讲解

    记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 代码如下:#include ...

    C++类静态成员与类静态成员函数详解

    也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。 静态成员不可在类体内进行赋值,因为它是被所有该类的对象所

    static 用法

    2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次 3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象...

    简述C++11就地初始化与列表初始化

    在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码: class C { private: int a=7; //C++11 ...

    C++的概念/解释,可打印,华南师范大学C++考过。

    64. 为什么函数模板的使用与普通的函数完全一样, 而类模板在使用时还必须被实例化? 13 65. 类模板继承时的语法与普通的类继承有什么不同? 13 66. 什么是打开文件?什么是关闭文件?为什么需要打开和关闭文件? 14...

    C#中static静态变量的用法实例

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型   静态全局变量 定义:在全局变量...

    JAVA基础知识精华总结 收藏

    ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的作用就是初始化。 (2) 静态对象的初始化 程序中主类的静态变量会在main方法执行前初始化。 不仅第一次创建对象时,类中的所有静态变量...

    关于C++静态数据成员的实现讲解

    静态数据成员必须进行初始化,初始化应在类体外进行,静态数据成员也可以引用,但不能引用私有数据部分。 接下来看一个例子: #include #include using namespace std ; class Student { private : //静态成员...

    C++静态成员变量和静态成员函数的使用方法总结

    类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会...8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名...

    java面试宝典

    96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101...

    千方百计笔试题大全

    96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101...

    C++大学教程,一本适合初学者的入门教材(part1)

    6.10 初始化类对象:构造函数 6.11 在构造函数中使用默认参数 6.12 使用析构函数 6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过...

    PHP静态成员变量

    静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会...8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名...

    【05-面向对象(下)】

    •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属 于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底...

    C/C++静态类和this指针详解及实例代码

    C/C++静态类和this指针详解 1、静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问...(1)静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或应用类型。 class CBook{ public:

    深入解析C++编程中的静态成员函数

    与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加static就成了静态成员函数。如 static int volume( ); 和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。 如果要在类外...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

Global site tag (gtag.js) - Google Analytics