- 下面代码的输出是什么?
class A { public: A() { } ~A() { cout<<"~A"<<endl; } }; class B:public A { public: B(A &a):_a(a) { } ~B() { cout<<"~B"<<endl; } private: A _a; }; int main(void) { A a; //很简单,定义a的时候调用了一次构造函数 B b(a); }
- ~B
- ~B ~A
- ~B ~A ~A
- ~B ~A ~A ~A
解析:
要想搞明白该问题,需要理解基类构造析构函数、子类构造析构函数和子类成员变量构造析构函数的调用顺序。
对于构造函数:基类构造函数 > 子类成员变量构造函数 > 子类构造函数
对于析构函数:子类析构函数 > 子类成员变量析构函数 > 基类析构函数
- 下面对静态数据成员的描述中,正确的是?
- 静态数据成员可以在类体内进行初始化
- 静态数据成员不可以被类的对象调用
- 静态数据成员不受private控制符的作用
- 静态数据成员可以直接用类名调用
static数据成员必须在类体之外进行定义。通常在定义时才进行初始化。但是,当类型为const static时的整形时可以在类体内进行初始化。