C++类的静态成员初始化详细讲解_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 的私有数据成员。

时间: 2024-07-30 10:21:29

C++类的静态成员初始化详细讲解_C 语言的相关文章

C++类成员构造函数和析构函数顺序示例详细讲解_C 语言

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数. (2)类的非静态数据成员,按照声明的顺序创建. (3)执行该类的构造函数. 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数. 下面看一个例子吧 复制代码 代码如下: class c{public:    c(){ printf("c\n"); }protected:private:}; class b {pub

C++嵌套类与局部类详细解析_C 语言

1. 嵌套类外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现.从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用.如果在外围类之外的作用域使用该类名时,需要加名字限定. 嵌套类中的成员函数可以在它的类体外定义. 嵌套类的成员函数对外围类的私有成员没有访问权,反之亦然. 嵌套类仅仅只是语法上的嵌入. 2. 局部类类也可以定义在函数体内,这样的类被称为局部类(loacl class).局部类只在定义它的局部域内可见. 局部类的成员

C++ explicit关键字的应用方法详细讲解_C 语言

C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面

C 语言环境设置详细讲解_C 语言

C 环境设置 本地环境设置 如果您想要设置 C 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C 编译器. 文本编辑器 这将用于输入您的程序.文本编辑器包括 Windows Notepad.OS Edit command.Brief.Epsilon.EMACS 和 vim/vi. 文本编辑器的名称和版本在不同的操作系统上可能会有所不同.例如,Notepad 通常用于 Windows 操作系统上,vim/vi 可用于 Windows 和 Linux/UNIX 操作系统上. 通过编辑

C 语言条件运算符详细讲解_C 语言

如果希望获得两个数中最大的一个,可以使用 if 语句,例如: if(a>b){ max = a; }else{ max = b; } 不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为: 表达式1 ? 表达式2 : 表达式3 条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值.条件表达式通常用于赋值语句之中. 上面的 if else 语句等价于: max = (a>b)

c++异常处理机制示例及详细讲解_C 语言

这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门.本文后附有c++异常的知识普及,有兴趣者也可以看看. 下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制. 复制代码 代码如下: #include "stdafx.h" #include<stdlib.h> #include<crtdbg.h> #include <iostream> // 内存泄露检测机

函数外初始化与函数内初始化详细解析_C 语言

关于函数外初始化与函数内初始化之前一直分的不是太清,也不太在意.昨天终于出现了这方面的问题,所以决定好好看下,以下是这次的一些收获,先看测试代码: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;bool FillStr(char *&szDst, int nSize){ bool bRet = false; if (nSize > 0) {  szDst = (char

C语言 if else 语句详细讲解_C 语言

前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条.第三条--一直到最后一条语句. 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用.这时候程序就需要做出判断,看用户是否是成年人,并给出提示. if-else语句 在C语言中,使用if和else关键字进行判断.请先看下面的代码: #include <stdio.h> int main() { int age; printf("请输入你的年龄:"

C++开发:为什么多线程读写shared_ptr要加锁的详细介绍_C 语言

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程