1.析构函数的调用时机:
1)} 或 文件尾
2)delete(有条件的)
3)catch()
当中途退出程序时(exit()、abort() )不调用析构函数
2.在函数内部定义的类叫内部类,内部类的成员函数只能是内联函数。
3.静态成员(类属性)
静态数据成员–用关键字static声明;
–该类的所有对象维护着同一份拷贝;
–不能在构造函数中初始化,应在类外单独进行,必须在生成对象之前用(::)来指明所属的类。
静态成员函数
–类外代码可以使用类名和作用域操作符(::)来调用静态成员函数;
–静态成员函数只能引用属于该类的静态数据成员或静态成员函数。
//具有静态数据、函数成员的Point类
#include <iostream>
using namespace std;
class Point//Point类声明
{
public://外部接口
Point(int xx=0, int yy=0) {X=xx;Y=yy;countP++;}
Point(Point &p);//拷贝构造函数
int GetX() {return X;}
int GetY() {return Y;}
static void GetC()
{cout<<" Object id="<<countP<<endl;}
private://私有数据成员
int X,Y;
static int countP;
};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}
int Point::countP=0;
void main()//主函数实现
{
Point A(4,5); //声明对象A
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetC(); //输出对象号,对象名引用
Point B(A); //声明对象B
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
Point::GetC(); //输出对象号,类名引用
}
#include <iostream>
using namespace std;
class A
{
public:
A(int xx):x(xx){}
static void f(A a);
private:
int x;
};
void A::f(A a)
{
/*
静态成员函数对对象成员的访问是错误的,
因为它是类属性,并不知晓对象的事。
*/
//cout<<x; //对x的引用是错误的
cout<<a.x; //正确
}
void main()
{
A obj(2);
obj.f(obj);
}
静态成员的性质
静态数据成员
–对象的存储空间中不包含静态成员的位置;
–尽管可能是私有成员,也必须在类外定义和初始化;
–若是对象成员,则必然调用构造函数
静态成员函数
–静态成员函数不含有this 指针