1、const
初始化 static const 成员,也就是全局的静态常量,这个用到的情况比较多,想必大家都会。通常就是在类的定义中申明 static const 成员,然后在实现文件中赋予初始值,比如:
/* (#) Test.h */
#pragma once
class Test {
public:
// 声明int 型的MASK 常量
static const int MASK;
};
/* (#) Test.cpp */
#include "Test.h"
// 定义Test::MASK 常量,注意这里不需要static 关键字
const int Test::MASK = 0xFFFF;
虽然这种 static const 的情况使用得最多,但有时候也会想用非 static,却是 const 的情况。static const 定义的常量是全局的,对该类的每一个实例(对象)甚至在全局范围都有效,而且一致。便有时候需要的常量是针对每一个实例的,每个实例都可能有同类型但不同 值的常量,这时候就要用到非 static,但 const 的申明,如
class Test {
public:
const int MY_MASK;
};
这种情况下,要在实例文件中像初始化 static const 常量一样,对其进行初始化是行不通的。
const int Test::MY_MASK = 0xFF; // 这样会报重定义错误
况且,就算编译能通过,也不能达到我们要求的“每个对象自己的常量”的要求。
正确的初始化是通过构造函数的初始化列表来进行,如:
class Test {
public:
const int MY_MASK;
Test() : MY_MASK(0xff) {}
};
如果不是在初始化列表中对 const 常量进行初始化,而是在构造函数中对其赋值的话,是不能成功的。很简单的道理:不能给 const 成员赋值。同样的道理,如果要初始化一个引用类型的成员变量,也不能在构造函数体内赋值,而只能在构造函数的初始化列表中进行初始化。
2、static
类的static成员不属于类的对象成员,也没有this指针,类生成N个对象,类的static也只会分配一个对象引入static主要是为了对类访问次数进行计数或者其它功能实现
Static的优点:
.它在类的作用域中,从而避免与其它全局变量和常量名字冲突
.方便类实行封装
.能明确表示类设计的意图
声明形式
static <数据成员,者函数,引用,数组,类>;
static成员的初始化
在effective c++49条款中有写到 static成员必须在class定义式之外被定义,除非它们是const而且是整数型。
#include <iostream>
using namespace std;
class test
{
public:
static int m_test;
//static int m_test = 10; //如果是这样初始化编译器会报错
};
int test::m_test = 10; //在class定义之外被定义。。。
int main()
{
test a,b;
cout << a.m_test << " " << b.m_test << endl;
a.m_test = 20;
cout << a.m_test << " " << b.m_test << endl;
return 0;
}
3、总结:
只有静态常量才可以在类声明中直接初始化。
Const成员,通过类构造函数的初始化列表初始化。
Static 需要在类外单独初始化(用::)。
辨析const和static
最新推荐文章于 2024-07-12 16:12:14 发布