1.什么是静态成员?
语句声明之前带关键字static的成员,可以是函数也可以是数据,静态成员不是任意单独对象的组成部分,而是该类全体对象所共享的。
2.有何优点?
1) 作用域位于类的范围之内,避免与其他类的成员或者全局作用域的名字冲突。
2)可以是私有成员,而全局对象不可以。
3)相比全局变量,静态成员与特定类的关系容易理解,程序含义清晰。
4)通过静态数据成员可以控制某个类的对象实例仅有一个(如单例模式的使用)。
//Singelton.h
class Singelton
{
private:
Singelton(){}
static Singelton* singel; //静态对象
public:
static Singelton* GetInstance() //静态函数
{
if(singel == NULL)
{
P(s); //加锁
if(NULL == singel)
singel = new Singelton();
Q(s);
}
return singel;
}
};
//Singelton.cpp
Singelton* Singelton::singel = NULL;//注意静态变量类外初始化
3.与普通成员的区别
1)普通对象与类的对象关联,是某个具体对象的组成部分;而静态成员不从属任何具体对象,有该类的所有对象共享;
因此,对于静态成员函数他们是不包含this指针,也不能被声明成const;
2)静态数据成员的类型可以是不完整的类型;
class Bar{
private:
static Bar mem1; //正确:静态成员可以为不完全类型
Bar mem2; //正确:指针成员可以为不完全类型
Bar mem3; //错误:数据成员必须为完全类型
};
3)对于静态数据成员(非常量)在程序启动时会进行初始化,生命周期为整个程序运行期间;
4)对于公有静态成员,我们可以直接通过类名进行访问。
5)可以使用静态成员作为默认实参。
class Screen{
public:
Screen& clear(char = bkground);
private:
static const int bkground;
};
4.静态成员使用注意
1.不论静态成员还是函数均是类内声明static关键字,如果在类外定义无须加static关键字;
2.静态数据成员的定义最好和其他非内联的数据成员定义在同一文件中;
3.静态数据成员进行类内初始化话时,必须为字面值常量;
4.静态成员函数定义时,不能使用this指针。
//Account.h
class Account {
public:
Account() = default;
public:
static double rate() { return interestRate; }
static void rate(double); //类内声明关键字
private:
static double interestRate;
static double initRate() { return .0225; } //静态函数可以在类内定义
static const std::string accountType; //不能在类内赋值
static constexpr int period = 30; //静态常量可在类内初始化
double daily_tbl[period];
};
//Account.cpp
const string Account::accountType("Savings Account"); //程序启动时,调用string构造函数
double Account::interestRate = initRate(); //因为initRate()实际为一常量表达式,所有可以这样初始化
void Account::rate(double newRate) //定义时不加static,也不用this指向数据成员
{
interestRate = newRate;
}