C/C++函数参数,传值域传址的区别

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class A{  
  5. public:  
  6.     A(){  
  7.         cout << "执行构造函数创建一个对象" << endl;  
  8.     }  
  9.   
  10.     A(A&){  
  11.         cout << "执行拷贝函数拷贝一个对象" << endl;  
  12.     }  
  13.   
  14.     ~A(){  
  15.         cout << "执行析构函数删除一个对象" << endl;  
  16.     }  
  17. };  
  18.   
  19. void func(A a){  
  20.     cout << "调用一个传值函数" << endl;  
  21. }  
  22.   
  23. void func2(A &a){  
  24.     cout << "调用一个传址函数" << endl;  
  25. }  
  26.   
  27. A getA(A a){  
  28.     return a;  
  29. }  
  30.   
  31. A getA2(A &a){  
  32.     return a;  
  33. }  
  34.   
  35. /** 
  36.  * 同getA4 
  37.  */  
  38. A* getA3(A &a){  
  39.     return &a;  
  40. }  
  41.   
  42. /** 
  43.  * 同getA3 
  44.  */  
  45. A* getA4(A *a){  
  46.     return a;  
  47. }  
  48.   
  49. /* 
  50.  * 按值传递的缺点...当创建一个新的对象之后,如果按值传递 
  51.  * 将复制构造函数创建对象的副本,副本在使用完成之后,又会执行析构函数删除该副本! 
  52.  */  
  53. int main(int argc, char** argv) {  
  54.   
  55.     A a;  
  56.     func(a);  
  57.     func(a);  
  58.   
  59.     cout << "-------" << endl;  
  60.   
  61.     func2(a);  
  62.     func2(a);  
  63.   
  64.     cout << "-------" << endl;  
  65.   
  66.     getA(a); // 将拷贝2个对象和删除2个对象,1个对象是作为参数传递的,另外一个对象是作为值返回的!  
  67.   
  68.     cout << "-------" << endl;  
  69.       
  70.     getA2(a); // 将拷贝1个对象和删除1个对象,该对象是作为值返回的!  
  71.   
  72.     cout << "-------" << endl;  
  73.     getA3(a); // 将不拷贝a的对象做为参数,也不会拷贝a的对象作为返回值(包括删除)!  
  74.     getA4(&a);  
  75.   
  76.     return (EXIT_SUCCESS);  
  77. }  

执行构造函数创建一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
执行拷贝函数拷贝一个对象
调用一个传值函数
执行析构函数删除一个对象
-------
调用一个传址函数
调用一个传址函数
-------
执行拷贝函数拷贝一个对象
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
执行析构函数删除一个对象
-------
执行拷贝函数拷贝一个对象
执行析构函数删除一个对象
-------
执行析构函数删除一个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值