C++类的静态成员初始化详细讲解
记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型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语言
下一篇:关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
本文标题:C++类的静态成员初始化详细讲解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/4031.html
您可能感兴趣的文章
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言没有round函数 round c语言
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 01-11ajax实现页面的局部加载
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05DEDE织梦data目录下的sessions文件夹有什