对象的生存期
1.局部对象
2.全局对象
3.动态创建的对象
1.对于局部定义的对象,每当程序控制流到达该对象定义处时,调用构造函数。当程序控制走出该局部域时,则调用析构函数。
2.对于静态局部定义的对象,在程序控制首次到达该对象定义处时,调用构造函数。当整个程序结束时调用析构函数。
2.对全局定义的对象,当程序进入入口函数main之前对象就已经定义,这时要调用构造函数。整个程序结束时调用析构函数。
3.动态创建的对象,使用new创建对象, delete释放对象.
静态成员
由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静
态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。
该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间
(静态成员数据不在对象空间中,访问它时没有this指针)。
静态成员初始化在类外进行初始化,不管共有或私有
静态数据成员属于整个类,使用时可用以下格式:
类名::静态数据成员名 或 对象.静态数据成员名==(前提 是可访问符为public)==
静态成员函数
class Object {
private:
int value;
static int num ;
public:
Object(int x = 0) :value(x) { num += 1;}
Object (const Object& obj) :value(obj. value) { num += 1;}
~Object() { num -= 1;}
void Print() const
{
num+=10;
cout <<" value" << this->value <<" num:” << num << endl ;
}
static int Show() const
{
num+=10;
cout << "value"<< this->value <<" num: "<< num << endl;
}
};
int Object: :num = 0;
int main()
{
Object obja(10) ;
obja.Show();
Object::Show();
}
没有this指针,要想访问对象成员,需要把对象当作参数传递进去
函数成员说明为静态,将与该类的不同对象无关。静态函数成员的调用,在对象之外可以采用下面的方式:
类名::函数名或对象名.函数名;
与静态数据成员相反,为使用方便,静态函数成员多为公有。
|