关于cout函数的运算法则
例题1:
int main() {
int a = 1;
cout << ++a << a++ << a << a++ << endl;
return 0;
}
运行结果:
标题内容
运算顺序是从右往左,先把所有的运算的部分给算完,再依次输出结果,所以是先算最后的a++,结果是1,再是a++,结果是2,再是++a,结果是4,然后再是a,结果是4。
关于继承关系中析构函数的调用顺序和规则
例题1:
class A {
public:
~A() {
cout << "DA ";
}
};
class C {
public:
~C() {
cout << "DC ";
}
};
class B :public A {
public:
~B() {
cout << "DB ";
}
private:
C c;
};
int main() {
A *p1 = new B;
B *p2 = new B;
delete p1;
cout << "\n";
delete p2;
cout << "\n";
return 0;
}
运行结果:
说明
由于p1的指针类型是A,因此与B没有关系,因此第一句定义时,只会调用A和B类的构造函数,在释放指针时只会调用A的析构函数,这体现的是静态。而p2的指针类型为B,因此在释放指针时会先调用派生类的析构函数,再调用成员对象的析构函数,最后再调用基类的构造函数。
例题2:
在例题一中稍加改动。
class A {
public:
virtual ~A() { //声明为虚函数
cout << "DA ";
}
};
class C {
public:
~C() {
cout << "DC ";
}
};
class B :public A {
public:
~B() {
cout << "DB ";
}
private:
C c;
};
int main() {
A *p1 = new B;
B *p2 = new B;
delete p1;
cout << "\n";
delete p2;
cout << "\n";
return 0;
}
运行结果:
说明
由于将A类的析构函数定义为了虚函数,因此在释放A类指针(前提new的是B类)的时候,会同时调用B的析构函数,体现了动态多态性。