加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 成员函数如何知道为特定对象调用它?

发布时间:2020-12-16 09:38:40 所属栏目:百科 来源:网络整理
导读:有这样的C代码: #include iostreamclass MojaKlasa{public: int z; void fun(){ std::cout this;};};int main(){ MojaKlasa a; a.z = 2; a.fun(); return 0;} 和相应的汇编代码: .file "prog50.cpp" .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .sect
有这样的C代码:

#include <iostream>

class MojaKlasa{
public:
  int z;
  void fun(){ std::cout << this;};
};

int main()
{
  MojaKlasa a;
  a.z = 2;
  a.fun();
  return 0;
}

和相应的汇编代码:

.file   "prog50.cpp"
    .local  _ZStL8__ioinit
    .comm   _ZStL8__ioinit,1,1
    .section    .text._ZN9MojaKlasa3funEv,"axG",@progbits,_ZN9MojaKlasa3funEv,comdat
    .align 2
    .weak   _ZN9MojaKlasa3funEv
    .type   _ZN9MojaKlasa3funEv,@function
_ZN9MojaKlasa3funEv:
.LFB957:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp,%ebp
    .cfi_offset 5,-8
    .cfi_def_cfa_register 5
    subl    $24,%esp
    movl    8(%ebp),%eax
    movl    %eax,4(%esp)
    movl    $_ZSt4cout,(%esp)
    call    _ZNSolsEPKv
    leave
    ret
    .cfi_endproc
.LFE957:
    .size   _ZN9MojaKlasa3funEv,.-_ZN9MojaKlasa3funEv
    .text
.globl main
    .type   main,@function
main:
.LFB958:
    .cfi_startproc
    .cfi_personality 0x0,-8
    .cfi_def_cfa_register 5
    andl    $-16,%esp
    subl    $32,%esp
    movl    $2,28(%esp)     # a.z = 2;
    leal    28(%esp),(%esp)
    call    _ZN9MojaKlasa3funEv   # a.fun();
    movl    $0,%eax
    leave
    ret
    .cfi_endproc
.LFE958:
    .size   main,.-main
    .type   _Z41__static_initialization_and_destruction_0ii,@function
_Z41__static_initialization_and_destruction_0ii:
.LFB960:
    .cfi_startproc
    .cfi_personality 0x0,%esp
    cmpl    $1,8(%ebp)
    jne .L7
    cmpl    $65535,12(%ebp)
    jne .L7
    movl    $_ZStL8__ioinit,(%esp)
    call    _ZNSt8ios_base4InitC1Ev
    movl    $_ZNSt8ios_base4InitD1Ev,%eax
    movl    $__dso_handle,8(%esp)
    movl    $_ZStL8__ioinit,4(%esp)
    movl    %eax,(%esp)
    call    __cxa_atexit
.L7:
    leave
    ret
    .cfi_endproc
.LFE960:
    .size   _Z41__static_initialization_and_destruction_0ii,.-_Z41__static_initialization_and_destruction_0ii
    .type   _GLOBAL__I_main,@function
_GLOBAL__I_main:
.LFB961:
    .cfi_startproc
    .cfi_personality 0x0,%esp
    movl    $65535,4(%esp)
    movl    $1,(%esp)
    call    _Z41__static_initialization_and_destruction_0ii
    leave
    ret
    .cfi_endproc
.LFE961:
    .size   _GLOBAL__I_main,.-_GLOBAL__I_main
    .section    .ctors,"aw",@progbits
    .align 4
    .long   _GLOBAL__I_main
    .weakref    _ZL20__gthrw_pthread_oncePiPFvvE,pthread_once
    .weakref    _ZL27__gthrw_pthread_getspecificj,pthread_getspecific
    .weakref    _ZL27__gthrw_pthread_setspecificjPKv,pthread_setspecific
    .weakref    _ZL22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create
    .weakref    _ZL20__gthrw_pthread_joinmPPv,pthread_join
    .weakref    _ZL21__gthrw_pthread_equalmm,pthread_equal
    .weakref    _ZL20__gthrw_pthread_selfv,pthread_self
    .weakref    _ZL22__gthrw_pthread_detachm,pthread_detach
    .weakref    _ZL22__gthrw_pthread_cancelm,pthread_cancel
    .weakref    _ZL19__gthrw_sched_yieldv,sched_yield
    .weakref    _ZL26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock
    .weakref    _ZL29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock
    .weakref    _ZL31__gthrw_pthread_mutex_timedlockP15pthread_mutex_tPK8timespec,pthread_mutex_timedlock
    .weakref    _ZL28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock
    .weakref    _ZL26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init
    .weakref    _ZL29__gthrw_pthread_mutex_destroyP15pthread_mutex_t,pthread_mutex_destroy
    .weakref    _ZL30__gthrw_pthread_cond_broadcastP14pthread_cond_t,pthread_cond_broadcast
    .weakref    _ZL27__gthrw_pthread_cond_signalP14pthread_cond_t,pthread_cond_signal
    .weakref    _ZL25__gthrw_pthread_cond_waitP14pthread_cond_tP15pthread_mutex_t,pthread_cond_wait
    .weakref    _ZL30__gthrw_pthread_cond_timedwaitP14pthread_cond_tP15pthread_mutex_tPK8timespec,pthread_cond_timedwait
    .weakref    _ZL28__gthrw_pthread_cond_destroyP14pthread_cond_t,pthread_cond_destroy
    .weakref    _ZL26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create
    .weakref    _ZL26__gthrw_pthread_key_deletej,pthread_key_delete
    .weakref    _ZL30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init
    .weakref    _ZL33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype
    .weakref    _ZL33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy
    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
    .section    .note.GNU-stack,"",@progbits

>似乎MojaKlasa类的函数fun()被翻译为普通的常规函数??.函数如何知道为特定对象调用它,例如a.fun() – >为对象a调用fun()?
>第二个问题是,MojaKlasa类的默认构造函数和析构函数在哪里?据说C自动为类创建构造函数和析构函数,但似乎并不是其中一个包含在汇编代码中.

解决方法

函数如何知道为特定对象调用它,例如a.fun() – >为对象a调用fun()?

指向对象的指针隐含地作为第一个隐藏参数传递给成员函数.

MojaKlasa类的默认构造函数和析构函数在哪里?

C原则是:您只需支付使用的费用.除非你的代码明确需要一个默认的无参数构造函数,否则编译器就不会生成它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读