• 1
  • 2
  • 3
  • 4
  • 5
  • 6

C++程序练习

关于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的析构函数,体现了动态多态性。
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注