局部对象
形参和函数体内部定义的变量统称为局部变量
-
局部静态对象 令局部变量的生命周期贯穿函数调用以及之后的时间。 可以将局部变量定义成static类型 局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。 代码举例: size_t count_calls() {
static size_t ctr = 0;//调用结束后这个值仍然有效
return ++ctr;
}
如果局部静态变量没有显式的初始化,它将执行值初始化,内置类型的局部静态变量初始化为0。
类的静态成员
一些成员与类本身直接相关,而不是与类的各个对象保持关联
-
声明静态成员 在成员的声明之前加上static关键字,使得其与类关联起来。
- 静态成员也可以是public或者private的
- 静态成员的类型可以是常量、引用、指针、类类型等
class A {
public:
void caculate() {a += a * b;}
static double fun1() {return b;}
static void fun1(double);//在类外定义该静态成员函数
private:
std::string name;
double a;
static double b;
static double init_b();
};
//每个A对象将包含两个数据成员:name和a。只存在一个b成员,而且b被所有A对象共享
//静态成员函数也不与任何对象绑定,它们不包含this指针,也不能在static函数体内使用this指针
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据 -
使用类的静态成员
-
使用作用域运算符直接访问静态成员: double r;
r = A::fun1();
-
使用类对象、引用、指针来访问静态成员: A aa;
A *bb = &aa;
double r;
r = aa.fun1();//通过A对象或者引用访问静态成员函数
r = bb -> fun1();//通过指向A对象的指针访问静态成员函数
-
静态成员函数不通过作用域运算符就能直接使用静态成员 void caculate() {a += a * b;}
-
定义静态成员 我们既可以在类的内部定义静态成员函数,也可以在类的外部定义静态成员函数。 当在类的外部定义静态成员函数时,不能重复使用static关键字,该关键字只能出现在类内的声明语句 指向类外部的静态成员时,必须指明所属的类名 //在类外定义静态成员函数void fun1(double);
void A::fun1(double num) {
b = num;
}
//在类外定义静态数据成员b
double A::b = init_b();
继承与静态成员
静态类型在编译时是已知的
如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。
如果基类中的静态成员是private的,则派生类无权访问它
class base {
public:
static void fun1();
};
class derived : public base {
void fun2(derived&);
};
derived derived_obj;
base::fun1();//正确,通过类名访问
derived::fun1();//正确,通过类名访问
derived_obj.fun1();//正确,通过derived对象访问,派生类对象能访问基类的静态成员
fun1();//正确,通过this对象访问
|