- #include <iostream>
- using namespace std;
- class Test {
- public:
- // 构造函数
- Test() {
- i = new int(1);
- }
- // 析构函数
- ~Test() {
- // 释放i指向的内存
- delete i;
- i = 0;
- }
- // 显示i的数值
- void show() {
- cout << *i << endl;
- }
- private:
- int * i;
- };
- // 将对象Test以拷贝的方式传递之后,由于变量t在函数作用域结束之后,会被注销。
- // 因此会调用析构函数,也就是说指针i会被删除掉。
- void test(Test t) {
- t.show();
- }
- int main() {
- Test t1;
- test(t1);
- // 此时t对象的show函数被调用的时候,t对象中的i已经是一个空指针了,因此程序会报错。
- t1.show();
- return 0;
- }
- #include <iostream>
- using namespace std;
- class Test {
- public:
- // 构造函数
- Test() {
- i = new int(1);
- }
- // 复制构造函数
- Test(Test & t) {
- // 为拷贝的对象生成一个新的指针。
- i = new int(*t.i);
- }
- // 析构函数
- ~Test() {
- cout << 析构函数 << endl;
- // 释放i指向的内存
- delete i;
- i = 0;
- }
- // 显示i的数值
- void show() {
- (*i)++;
- cout << *i << endl;
- }
- private:
- int * i;
- };
- // 当该函数执行完时,依然会调用析构函数。但是此时释放的是拷贝对象中的i的内存
- // 并不影响main函数的i指针。
- void test(Test t) {
- t.show();
- }
- int main() {
- Test t1;
- test(t1);
- // 此时t对象的show函数被调用的时候,t对象中的i没有受到影响,因此程序正常。
- t1.show();
- return 0;
- }
输出:
2
析构函数
2
析构函数
可以发现,析构函数被调用了两次。这就是因为在test函数中的局部变量t,在函数执行完之后,被注销时触发了一次析构函数。
同时,我们要注意一个问题:明明在show()函数中调用了两次i++,但是为何输出是2跟2,而不是2跟3?
那是因为,当复制构造函数被触发时,test()函数中的对象t,与main函数中的t不是一个对象。
转载于:https://blog.51cto.com/machine/428362