VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 198|回复: 3

麻烦看下,类创建对象大致过程,谢谢

[复制链接]
06_avatar_middle
最佳答案
0 
在线会员 发表于 2020-7-23 19:37:06 | 显示全部楼层 |阅读模式
#include <iostream>
using namespace std;
class human{
public:
    human();
    human(const human&);
    static int human_num;
    ~human();
    void print();

};

int human::human_num = 0;

human::human(){
    human_num++;
    print();
}

human::human(const human& rhs){
    human_num++;
    print();
}

human::~human(){
    human_num--;
    print();
}

human f1(human x)
{
    return x;
}

void human::print(){
    cout <<"human num is: " <<human_num <<endl;
}

int main(int argc, char* argv[]){
    human h1;
    human h2=f1(h1);//这里理解不了
    return 0;
}

human h2=f1(h1)//这里为什么会2次调用human::human(const human& rhs)

我以为是这样:
先创建human h2这个对象(调用默认构造函数)
然后再创建human f1这个对象函数(调用一般构造函数)
再接着创建human x这个对象(调用默认构造函数)

为什么系统却是这样调用,能不能大致讲下c++是怎么创建这个过程





上一篇:字符串转码问题
下一篇:qt的&quot;constexpr 函数不会生成常数表达式&quot; 报错请教
08_avatar_middle
最佳答案
3 
在线会员 发表于 2020-7-23 23:39:23 | 显示全部楼层
本帖最后由 SummerGull 于 2020-7-23 23:51 编辑

human h2=f1(h1)//这里为什么会2次调用human::human(const human& rhs)

f1(h1)你这里是调用函数。 传入参数的时候 调用  复制构造函数human(const human& rhs)。return 也会 调用 复制构造函数human(const human& rhs)。
因为 这些操作 都是 传入 值 而不是址。 你可以 把函数 改成  human* f1(human* x)。你可以看看 复制构造函数有没有执行。想想就懂了
你肯定问题出在 return 身上。  参数这块没问题。当初我也是 问题出在return上,。 因为之前学C++没学过汇编 不知道 return 也会 复制一遍。所以强调了 用 引用或者指针返回(前提是 你的 临时对象 是 static!!!不然 只会 成功一次 这是C++的安全机制 其实他这个 安全机制 就会误导人 导致人以为编写的程序没问题。)
还有就是 你可以参考下 反汇编代码
  1.     human h1;
  2. 010B295A  lea         ecx,[h1]  
  3. 010B295D  call        human::human (010B10F0h)  
  4. 010B2962  mov         dword ptr [ebp-4],0  
  5.     human h2 = f1(h1);//这里理解不了
  6. 010B2969  push        ecx  
  7. 010B296A  mov         ecx,esp  
  8. 010B296C  mov         dword ptr [ebp-0F0h],esp  
  9. 010B2972  lea         eax,[h1]  
  10. 010B2975  push        eax  
  11. 010B2976  call        human::human (010B140Bh)  
  12. 010B297B  lea         ecx,[h2]  
  13. 010B297E  push        ecx  
  14. 010B297F  call        f1 (010B123Ah)  
  15. 010B2984  add         esp,8  
  16. 010B2987  mov         dword ptr [ebp-104h],eax  
复制代码


06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-7-23 21:25:19 | 显示全部楼层
顶自己一下哈
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-7-23 23:48:15 | 显示全部楼层
好的,谢谢
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-12-1 01:22

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表