c++ 中 const ,static , static const, const static 辨析...
时间:2010-08-08 来源:msjianghu
3.在c++中,static静态成员变量不能在类内部初始化。 在c++中,const常量成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
*** const variable: 1.const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象 其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道 const 数据成 员的值是什么。 2.const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中 的枚举常量来实现,或者static const。 3.C++中的const与C中的const不再一样。它会在每一个对象中占有一定的内存空间,代表一个值,这个值 一旦被初始化就不能在改变。意味着:This is a constant for the lifetime of the object. 但是,每一个 该类型的不同的对象可以有不同的该值。 如:
class Test const int Test::c = 0; |
****
const 成员函数,主要的目的是防止修改对象的内容。即:int Fun() const; 不可以修改对象的数据,可以访问对象的数据,访问成员函数时,只能是const的,不能是non_const的成员函数。
static成员函数,主要的目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数的没有this指针,这导致:
1.不能直接存取类的非静态成员变量
2.调用非静态成员函数不能被声明为virtual
class foo |
这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。
构造函数初始化表达式:
class foo |
如果构造函数是在类外定义,则可以这样写:
class foo
{ ...
} |
***
类里的static成员初始化:
类中的static变量是属于类的,不属于某个对象,它在整个程序的运行过程中只有一个副本,因此不能在定义对象时对变量初始化,就是不能用构造函数来初始化。其正确的初始化方式是:
<数据类型><类名> ::<静态数据成员名> = <值> ,例如:
class foo |
这表明:
(1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
(2)初始化时不加该成员的访问权限控制符private,public等。
(3)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
(4)设定static成员变量初值时,不受任何存取权限的影响。
(5)请注意,static成员变量的类型也出现在初值设定语句中。
3.类里的static const 和const static成员初始化:
const成员要在构造函数初始化,而static成员在需要在在类体外初始化,那么static const 和 const static 的成员应该在哪里进行初始化呢?这两个写法又会有什么不一样吗?其实他俩都一样。在Thinking in c++ 英文版Chapter 8 中有如下例子:
class StringStack{ const static int m_size; // 也可先不初始化,size 也是 const string* stack[size]; int index; public: StringStack(); void push(const string* s);
const string* pop(); |
它们没有区别,虽然 一个是静态常量, 一个是常量静态。 静态都将存储在全局变量区域,其实最后结果都是一样的。 可能在不同编译器内,不同处理,但是最后结果是一样的。
下面是一个完整的例子:
#ifndef A_H_
{ //常量成员的初始化
{
{ |
总结一下:
const成员要在构造函数的初始化列表初始化
static成员在需要在在类体外初始化
static const 和 const static 的成员即可在定义初始化也可在类体外初始化