一、类的作用域
1、类的作用域:在类中定义数据成员和函数成员的作用域是整个类,在类外是否可见取决于该类的访问权限(public、protect、private)。
2、分类:按作用域分类的话,可以分为一般类、嵌套类(定义在某个类中)、局部类(定义在某个函数内)。
二、类的生存周期
1、按生存周期由常至短的排:全局对象>静态对象(外部静态>内部静态)>局部对象。
2、各种对象的定义:
(1)全局对象:定义在某个文件中,它的作用域为整个程序。程序开始执行时,调用构造函数创建该对象;当程序结束时,程序调用析构函数释放该对象。
(2)静态对象:其作用域也是整个文件,它与全局对象的区别在于,静态对象由于有static的限制,所以只能作用于本文件中;而全局对象则不同,在其他文件中要使用该变量 的话,用extern进行外部声明即可。静态按作用域的不同可分为内部静态对象和外部静态对象。内部静态对象的作用域是定义该对象的函数体类或者分程序 内,外部静态对象的作用域就是定义该对象的文件内。
(3)局部对象:局部对象一般定义在一个函数体内或者一个分程序中。
三、例子:验证各种对象的作用域以及生存周期。
/*******************************************************
时间:2016年10月2日14:32:12
功能:用于验证全局变量、静态变量、局部变量之间的关系
********************************************************/
#include <iostream>
using namespace std;
class Car
{
public:
Car(char *pn); //构造函数
~Car(); //析构函数
private:
char name[10];
};
Car::Car(char *pn)
{
if(pn != 0)
{
strcpy(name,pn);
cout<<"call the "<<name<<" constructor"<<endl;
}
}
Car::~Car()
{
printf("call the %s Deconstructor\n",name);
//cout<<"call the"<<name<<" Deconstructor"<<endl; //这里未用cout是因为cout会先于全局对象析构
}
void func()
{
Car c1("func car"); //局部对象
static Car c2("innerStatic Car"); //内部静态对象
cout<<"in the func"<<endl;
}
Car c3("Global Car"); //全局对象
static Car c4("externStatic Car"); //外部静态对象
void main()
{
Car c5("main car");
cout<<"before call the func function"<<endl;
func(); //从结果来看函数对象在函数调用时初始化,函数结束时释放
cout<<"after call the func function"<<endl;
}
运行结果如下图: