C++中,类对象也可以充当类的成员,这样的类称为分析类或组合类。在分析类的对象作为其他类的成员变量时,需要注意其构造函数、析构函数及静态成员的调用。
构造函数和析构函数的调用
当组合类的对象作为另一个类的成员时,先调用另一个类的构造函数,再调用组合类的构造函数;在调用析构函数时,先调用组合类的析构函数,再调用另一个类的析构函数。
示例1:
class A {
public:
A() {cout << "A Constructor" << endl;}
~A() {cout << "A Destructor" << endl;}
};
class B {
public:
B() {cout << "B Constructor" << endl;}
~B() {cout << "B Destructor" << endl;}
};
class C {
public:
A a;
B b;
C() {cout << "C Constructor" << endl;}
~C() {cout << "C Destructor" << endl;}
};
int main() {
C c;
return 0;
}
运行结果:
A Constructor
B Constructor
C Constructor
C Destructor
B Destructor
A Destructor
可以看到,先构造A,再构造B,最后构造C;而在销毁对象时,先销毁C,再销毁B和A。
示例2:
class Date {
public:
int year;
int month;
int day;
Date(int y, int m, int d) : year(y), month(m), day(d) {
cout << "Date Constructor" << endl;
}
~Date() {cout << "Date Destructor" << endl;}
};
class Employee {
public:
string name;
Date birthDate;
Employee(string n, Date d) : name(n), birthDate(d) {
cout << "Employee Constructor" << endl;
}
~Employee() {cout << "Employee Destructor" << endl;}
};
int main() {
Date birthdate(2001, 10, 1);
Employee employee("Tom", birthdate);
return 0;
}
运行结果:
Date Constructor
Employee Constructor
Employee Destructor
Date Destructor
可以看到,首先构造Date对象,然后构造Employee对象,最后按相反的顺序销毁对象。
静态成员的调用
静态成员是属于整个类的,其调用方式与一般成员不同。一个类的静态成员只有一份实体,不随对象的生成而生成。
当组合类对象生成时,其静态成员只会初始化一次,而不是针对每个对象分别初始化。当组合类对象被销毁时,其静态成员也不会被销毁,直到整个程序结束。
示例:
class A {
public:
A() {cout << "A Constructor" << endl;}
~A() {cout << "A Destructor" << endl;}
static int x;
static void print() {cout << "x=" << x << endl;}
};
int A::x = 1;
class B {
public:
A a;
B() {cout << "B Constructor" << endl;}
~B() {cout << "B Destructor" << endl;}
};
int main() {
B b1, b2;
A::print();
return 0;
}
运行结果:
A Constructor
B Constructor
A Constructor
B Constructor
x=1
B Destructor
A Destructor
B Destructor
A Destructor
可以看到,静态成员x只被初始化了一次,并且在对象被销毁时没有被销毁。可以通过静态成员函数print,在不创建任何对象的情况下访问静态成员x的值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++分析类的对象作类成员调用构造与析构函数及静态成员 - Python技术站