C++中关于类中常数静态成员初始化的问题
2009-11-12 10:15
621 查看
申明, 本文由某论坛的一篇帖子整理.
记住:
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!!
一般地静态数据成员在该类定义之外被初始化如同一个成员函数被定义在类定义之
外一样,在这种定义中的静态成员的名字必须被其类名限定修饰,如上例中的
int
test
:
:
num =
0;
与全局对象一样对于静态数据成员在程序中也只能提供一个定义,这意味着静态数据成员的初始化不应该被放在头文件中而应该放在含有类的非inline函数定义的文件中, 静态数据成员可以被声明为任意类型它们可以是const 对象数组或类对象等等
作为特例有序型的const 静态数据成员可以在类体中用一常量值初始化, 例如如果决定用一个字符数组而不是string 来存储账户的姓名那么我们可以用int型的const数据成员指定该数组的长度例如:
于
这个特例有一些有趣的事情值得注意, 用常量值作初始化的有序类型的const 静态数据成员是一个常量表达式constant expression
,如果需要在类体中使用这个被命名的值那么类设计者可声明这样的静态数据成员, 例如因为const
静态数据成员nameSize是一个常量表达式所以类的设计者可以用它来指定数组数据成员name 的长度, 在类体内初始化一个const
静态数据成员时该成员必须仍然要被定义在类定义之外
但是因为这个静态数据成员的初始值是在类体中指定的, 所以在类定义之外的定义不能指定初始值, 因为name 是一个数组不是有序类型所以它不能在类体内被初始化, 任何试图这么做的行为都会导致编译时刻错误例如:
name 必须在类定义之外被初始化, 这个例子还说明了一点, 我们注意到成员nameSize指定了数组name 的长度, 而数组name的定义出现在类定义之外,
const char Account::name[nameSize] = "Savings Account";
nameSize
没有被类名Account 限定修饰. 尽管nameSize是私有成员, 但是name的定义仍没有错, 怎么会这样?
如同类成员函数的定义可以引用类的私有成员一样静态数据成员的定义也可以引用静态数据成员, name
的定义是在它的类的域内当限定修饰名Account::name被看到之后它就可以引用Account 的私有数据成员
记住:
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型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" ) ; |
// 头文件 class Account { // ... private : static const int nameSize = 16; //好像vc下不支持这样 static const char name[ nameSize] ; } ; // 文本文件 const int 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" ; // 错误 } ; |
const char Account::name[nameSize] = "Savings Account";
nameSize
没有被类名Account 限定修饰. 尽管nameSize是私有成员, 但是name的定义仍没有错, 怎么会这样?
如同类成员函数的定义可以引用类的私有成员一样静态数据成员的定义也可以引用静态数据成员, name
的定义是在它的类的域内当限定修饰名Account::name被看到之后它就可以引用Account 的私有数据成员
相关文章推荐
- C++中关于类中常数静态成员初始化的问题
- 关于c++中类静态成员函数可能破坏类封装性的问题
- C++ 静态成员的类内初始化-of non-integral type 问题
- 静态成员变量初始化问题。关于 error LNK2005 static int:已经在***.obj中定义
- 关于C++静态成员函数访问非静态成员变量的问题
- [笔试题 9][c/c++]关于成员变量,对象成员的初始化问题
- 关于c++的类中成员变量初始化问题+初始化列表中对应顺序问题!
- 关于c++的class(偏c++11以前,构造、静态成员、const、初始化列表、友元、内联、template)
- C++静态成员的初始化问题,导致定义的静态成员 unresolved
- 关于C++中用静态成员统计实例化对象个数问题_CVTE技术面问题
- 关于C++静态成员函数访问非静态成员变量的问题
- C++静态整型成员数据在类内初始化
- C++成员变量的初始化顺序问题
- [C++] 关于子类声明与父类同名同类型的成员变量的问题
- 关于C++重定义多次初始化问题
- C++ 关于“不允许使用数据成员初始值设定”的问题
- 关于类静态成员的初始化
- 关于C++和C#中的静态方法的问题!
- C++成员变量的初始化顺序问题
- Java, C++ 单例模式与静态成员初始化对比