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

 更新时间:2013年09月29日 09:07:17   作者:  
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化

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

复制代码 代码如下:

#include <iostream>
using namespace std;
class test
{
public:
static int num;
};
int test::num = 0;
void main()
{
cout<<test::num <<endl;
test::num = 20;
cout<<test::num <<endl;
}

一般地静态数据成员在该类定义之外被初始化如同一个成员函数被定义在类定义之外一样,在这种定义中的静态成员的名字必须被其类名限定修饰,如上例中的
int test::num = 0;
与全局对象一样对于静态数据成员在程序中也只能提供一个定义,这意味着静态数据成员的初始化不应该被放在头文件中而应该放在含有类的非inline函数定义的文件中, 静态数据成员可以被声明为任意类型它们可以是const 对象数组或类对象等等
复制代码 代码如下:

#include <string>
class Account {
// ...

private:
static const string name;
};
const string Account::name("Savings Account");


作为特例有序型的const 静态数据成员可以在类体中用一常量值初始化, 例如如果决定用一个字符数组而不是string 来存储账户的姓名那么我们可以用int型的const数据成员指定该数组的长度例如:
复制代码 代码如下:

// 头文件
class Account {
// ...
private:
static const int nameSize = 16;//好像vc下不支持这样
static const char name[nameSize];
};
// 文本文件
cons tint Account::nameSize;// 必需的成员定义

const char Account::name[nameSize]="Savings Account";


于这个特例有一些有趣的事情值得注意, 用常量值作初始化的有序类型的const 静态数据成员是一个常量表达式constant expression ,如果需要在类体中使用这个被命名的值那么类设计者可声明这样的静态数据成员, 例如因为const 静态数据成员nameSize是一个常量表达式所以类的设计者可以用它来指定数组数据成员name 的长度, 在类体内初始化一个const 静态数据成员时该成员必须仍然要被定义在类定义之外
但是因为这个静态数据成员的初始值是在类体中指定的, 所以在类定义之外的定义不能指定初始值, 因为name 是一个数组不是有序类型所以它不能在类体内被初始化, 任何试图这么做的行为都会导致编译时刻错误例如:
复制代码 代码如下:

class Account {
// ...
private:
static const int nameSize = 16;// ok: 有序类型
static const char name[nameSize]= "Savings Account";// 错误
};

name 必须在类定义之外被初始化, 这个例子还说明了一点, 我们注意到成员nameSize指定了数组name 的长度, 而数组name的定义出现在类定义之外,
const char Account::name[nameSize] = "Savings Account";

nameSize 没有被类名Account 限定修饰. 尽管nameSize是私有成员, 但是name的定义仍没有错, 怎么会这样? 如同类成员函数的定义可以引用类的私有成员一样静态数据成员的定义也可以引用静态数据成员, name 的定义是在它的类的域内当限定修饰名Account::name被看到之后它就可以引用Account 的私有数据成员。

相关文章

  • C++11的右值引用的具体使用

    C++11的右值引用的具体使用

    这篇文章主要介绍了C++11的右值引用的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 标准C++类string的Copy-On-Write技术

    标准C++类string的Copy-On-Write技术

    这里,我想从C++类或是设计模式的角度为各位揭开Copy-On-Write技术在string中实现的面纱,以供各位在用C++进行类库设计时做一点参考
    2013-11-11
  • C语言 用while循环求和的平均值操作

    C语言 用while循环求和的平均值操作

    这篇文章主要介绍了C语言 用while循环求和的平均值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C/C++中使用列表框组件Qt ListWidget

    C/C++中使用列表框组件Qt ListWidget

    本文详细讲解了C/C++中使用列表框组件Qt ListWidget的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • QT编写地图实现获取区域边界

    QT编写地图实现获取区域边界

    区域边界是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同。本文将具体介绍QT在编写地图时如何实现获取区域边界,需要的可以参考一下
    2022-01-01
  • C++指针和数组:字符和字符串、字符数组的关联和区别

    C++指针和数组:字符和字符串、字符数组的关联和区别

    字符串是一种重要的数据类型,但是c语言并没有显示的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。在C++标准模板库(STL)中提供了string类,实现了对字符串的封装。
    2022-12-12
  • 内核线程优先级设置的方法介绍

    内核线程优先级设置的方法介绍

    本篇文章介绍了,内核线程优先级设置的方法。需要的朋友参考下
    2013-05-05
  • C语言 图文并茂详解程序编译过程

    C语言 图文并茂详解程序编译过程

    C语言是一种编译型语言,需要把源文件进行编译之后才能运行,它的编译过程是:预处理:展开头文件、宏替换,去掉注释,条件编译;编译:检查语法,生成汇编;汇编:把生成的汇编文件汇编成机器码;链接:链接到一起生成可执行程序
    2022-04-04
  • 详解c++中的异常

    详解c++中的异常

    程序在运行过程中,有对也就有错,正确那么就不用说了,但是如果错误,那么我们如何快速的定位到错误的位置,以及知道发生了什么错误。当一个函数发现自己无法处理的异常,就会抛出一个异常,让函数调用者直接或者间接的处理这个错误。本文将详解介绍c++中的异常
    2021-06-06
  • C++超详细梳理IO流操作

    C++超详细梳理IO流操作

    当程序与外界进行信息交换时,存在两个对象,一个是程序中的对象,另一个是文件对象。流是信息流动的一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动
    2022-07-07

最新评论