按值传递对象和按址传递对象
演示程序
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){cout<<"执行构造函数创建一个对象\n";} 7 A(A&){cout<<"执行复制构造函数创建该对象的副本\n";} 8 ~A(){cout<<"执行析构函数删除该对象\n";} 9 }; 10 A func(A one) 11 { 12 return one;//func函数的返回值是类A的一个对象 13 } 14 int main() 15 { 16 A a;//执行第一次构造函数-->执行构造函数创建一个对象 17 func(a);//跳转到函数定义处,执行两次复制构造函数-->第一次,传递参数,第二次,返回参数 18 //func函数调用完毕,执行析构函数释放掉func函数内存,又因为返回值也会被释放,所以在此调用析构函数释放 19 return 0;//main函数结束,调用析构函数释放对象a 20 }
结果:
修改,改为按址传递对象
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){cout<<"执行构造函数创建一个对象\n";} 7 A(A&){cout<<"执行复制构造函数创建该对象的副本\n";} 8 ~A(){cout<<"执行析构函数删除该对象\n";} 9 }; 10 A* func(A *one) 11 { 12 return one;//func函数的返回值是类A的一个对象,-->现在返回了一个对象地址 13 } 14 int main() 15 { 16 A a; 17 func(&a);//运用按址传递传递参数的地址来减少复制构造函数的使用 18 return 0;//main函数结束,调用析构函数释放对象a 19 }
结果
证明按址传递比按值传递对象要节约资源得多