2.2copy constructor的构建操作

4 篇文章 0 订阅
2 篇文章 0 订阅

有三种情况,会以一个object的内容作为另一个class object的初值。

1.一个object做明确的初始化操作

class X;

X x;

X xx = x;

2.当object被当作参数交给某个函数时。

extern void foo(X x);

void bar()

{

    X xx;

    foo(xx);

}

3.当函数传回一个class object时。

X foo_bar()

{

    X xx;

    return xx;

}

 

Default Memberwise Initialization

当class object以“相同class的另一个object”作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个object身上。不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization。

“Default constructor和copy constructors在必要的时候才由编译器产生出来”

c++ standard 把copy constructor区分为trivial和nontrivial两种,只有nontrivial的实体才会被合成于程序之中。决定一个copy constructor是否为trivial的标准在于class是否展现出所谓的“bitwise copy semantics"

 

Bitwise Copy Semantics

 

举例:

 

class Word{

public:

  Word(const char*);

  ~Word(){delete[] str;}

private:

  int cnt;

  char* str;

};

Word::Word(const char*){

 

}

 

int main(){

  Word noun("book");

  Word verb = noun;

  return 0;

}

// 反汇编
objdump -dC test.o
test.o:     file format elf32-i386
Disassembly of section .text:
00000000 <Word::Word(char const*)>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                   pop    %ebp
   4: c3                   ret    
00000005 <main>:
   5: 55                   push   %ebp
   6: 89 e5                 mov    %esp,%ebp
   8: 83 e4 f0             and    $0xfffffff0,%esp
   b: 53                   push   %ebx
   c: 83 ec 2c             sub    $0x2c,%esp
   f: c7 44 24 04 00 00 00 movl   $0x0,0x4(%esp)
  16: 00 
  17: 8d 44 24 18           lea    0x18(%esp),%eax
  1b: 89 04 24             mov    %eax,(%esp)
  1e: e8 fc ff ff ff       call   1f <main+0x1a>
  23: 8b 44 24 18           mov    0x18(%esp),%eax
  27: 89 44 24 10           mov    %eax,0x10(%esp)
  2b: 8b 44 24 1c           mov    0x1c(%esp),%eax
  2f: 89 44 24 14           mov    %eax,0x14(%esp)
  33: bb 00 00 00 00       mov    $0x0,%ebx
  38: 8d 44 24 10           lea    0x10(%esp),%eax
  3c: 89 04 24             mov    %eax,(%esp)
  3f: e8 fc ff ff ff       call   40 <main+0x3b>
  44: 8d 44 24 18           lea    0x18(%esp),%eax
  48: 89 04 24             mov    %eax,(%esp)
  4b: e8 fc ff ff ff       call   4c <main+0x47>
  50: 89 d8                 mov    %ebx,%eax
  52: 83 c4 2c             add    $0x2c,%esp
  55: 5b                   pop    %ebx
  56: 89 ec                 mov    %ebp,%esp
  58: 5d                   pop    %ebp
  59: c3                   ret    
Disassembly of section .text._ZN4WordD2Ev:
00000000 <Word::~Word()>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 83 ec 18             sub    $0x18,%esp
   6: 8b 45 08             mov    0x8(%ebp),%eax
   9: 8b 40 04             mov    0x4(%eax),%eax
   c: 85 c0                 test   %eax,%eax
   e: 74 0e                 je     1e <Word::~Word()+0x1e>
  10: 8b 45 08             mov    0x8(%ebp),%eax
  13: 8b 40 04             mov    0x4(%eax),%eax
  16: 89 04 24             mov    %eax,(%esp)
  19: e8 fc ff ff ff       call   1a <Word::~Word()+0x1a>
  1e: c9                   leave  
  1f: c3                   ret    

 

不需要合成一个default copy constructor,因为上述声明展现了default copy semantics。

 

//举例

//test.cpp

#include<string>

using namespace std;

class Word{

public:

  Word(const string& s);

  ~Word(){}

private:

  int cnt;

  string str;

};

Word::Word(const string& s){

 

}

int main(){

  Word noun("book");

  Word verb = noun;

  return 0;

}

//objdump -dC test.o

编译器必须合成出一个copy constructor以便调用member class String object的copy constructor

test.o:     file format elf32-i386

 

 

Disassembly of section .text:

 

00000000 <Word::Word(std::string const&)>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 ec 18             sub    $0x18,%esp

   6: 8b 45 08             mov    0x8(%ebp),%eax

   9: 83 c0 04             add    $0x4,%eax

   c: 89 04 24             mov    %eax,(%esp)

   f: e8 fc ff ff ff       call   10 <Word::Word(std::string const&)+0x10>

  14: c9                   leave  

  15: c3                   ret    

 

00000016 <main>:

  16: 55                   push   %ebp

  17: 89 e5                 mov    %esp,%ebp

  19: 83 e4 f0             and    $0xfffffff0,%esp

  1c: 53                   push   %ebx

  1d: 83 ec 3c             sub    $0x3c,%esp

  20: 8d 44 24 2f           lea    0x2f(%esp),%eax

  24: 89 04 24             mov    %eax,(%esp)

  27: e8 fc ff ff ff       call   28 <main+0x12>

  2c: 8d 44 24 2f           lea    0x2f(%esp),%eax

  30: 89 44 24 08           mov    %eax,0x8(%esp)

  34: c7 44 24 04 00 00 00 movl   $0x0,0x4(%esp)

  3b: 00 

  3c: 8d 44 24 28           lea    0x28(%esp),%eax

  40: 89 04 24             mov    %eax,(%esp)

  43: e8 fc ff ff ff       call   44 <main+0x2e>

  48: 8d 44 24 28           lea    0x28(%esp),%eax

  4c: 89 44 24 04           mov    %eax,0x4(%esp)

  50: 8d 44 24 20           lea    0x20(%esp),%eax

  54: 89 04 24             mov    %eax,(%esp)

  57: e8 fc ff ff ff       call   58 <main+0x42>

  5c: 8d 44 24 28           lea    0x28(%esp),%eax

  60: 89 04 24             mov    %eax,(%esp)

  63: e8 fc ff ff ff       call   64 <main+0x4e>

  68: 8d 44 24 2f           lea    0x2f(%esp),%eax

  6c: 89 04 24             mov    %eax,(%esp)

  6f: e8 fc ff ff ff       call   70 <main+0x5a>

  74: 8d 44 24 20           lea    0x20(%esp),%eax

  78: 89 44 24 04           mov    %eax,0x4(%esp)

  7c: 8d 44 24 18           lea    0x18(%esp),%eax

  80: 89 04 24             mov    %eax,(%esp)

  83: e8 fc ff ff ff       call   84 <main+0x6e>

  88: bb 00 00 00 00       mov    $0x0,%ebx

  8d: 8d 44 24 18           lea    0x18(%esp),%eax

  91: 89 04 24             mov    %eax,(%esp)

  94: e8 fc ff ff ff       call   95 <main+0x7f>

  99: 8d 44 24 20           lea    0x20(%esp),%eax

  9d: 89 04 24             mov    %eax,(%esp)

  a0: e8 fc ff ff ff       call   a1 <main+0x8b>

  a5: 89 d8                 mov    %ebx,%eax

  a7: 83 c4 3c             add    $0x3c,%esp

  aa: 5b                   pop    %ebx

  ab: 89 ec                 mov    %ebp,%esp

  ad: 5d                   pop    %ebp

  ae: c3                   ret    

  af: 89 c3                 mov    %eax,%ebx

  b1: 8d 44 24 28           lea    0x28(%esp),%eax

  b5: 89 04 24             mov    %eax,(%esp)

  b8: e8 fc ff ff ff       call   b9 <main+0xa3>

  bd: eb 12                 jmp    d1 <main+0xbb>

  bf: 89 c3                 mov    %eax,%ebx

  c1: 8d 44 24 20           lea    0x20(%esp),%eax

  c5: 89 04 24             mov    %eax,(%esp)

  c8: e8 fc ff ff ff       call   c9 <main+0xb3>

  cd: eb 02                 jmp    d1 <main+0xbb>

  cf: 89 c3                 mov    %eax,%ebx

  d1: 8d 44 24 2f           lea    0x2f(%esp),%eax

  d5: 89 04 24             mov    %eax,(%esp)

  d8: e8 fc ff ff ff       call   d9 <main+0xc3>

  dd: 89 d8                 mov    %ebx,%eax

  df: 89 04 24             mov    %eax,(%esp)

  e2: e8 fc ff ff ff       call   e3 <main+0xcd>

  e7: 89 c3                 mov    %eax,%ebx

  e9: 8d 44 24 20           lea    0x20(%esp),%eax

  ed: 89 04 24             mov    %eax,(%esp)

  f0: e8 fc ff ff ff       call   f1 <main+0xdb>

  f5: 89 d8                 mov    %ebx,%eax

  f7: 89 04 24             mov    %eax,(%esp)

  fa: e8 fc ff ff ff       call   fb <main+0xe5>

 

Disassembly of section .text._ZN4WordD2Ev:

 

00000000 <Word::~Word()>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 ec 18             sub    $0x18,%esp

   6: 8b 45 08             mov    0x8(%ebp),%eax

   9: 83 c0 04             add    $0x4,%eax

   c: 89 04 24             mov    %eax,(%esp)

   f: e8 fc ff ff ff       call   10 <Word::~Word()+0x10>

  14: c9                   leave  

  15: c3                   ret    

 

Disassembly of section .text._ZN4WordC2ERKS_:

 

00000000 <Word::Word(Word const&)>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 ec 18             sub    $0x18,%esp

   6: 8b 45 0c             mov    0xc(%ebp),%eax

   9: 8b 10                 mov    (%eax),%edx

   b: 8b 45 08             mov    0x8(%ebp),%eax

   e: 89 10                 mov    %edx,(%eax)

  10: 8b 45 0c             mov    0xc(%ebp),%eax

  13: 8d 50 04             lea    0x4(%eax),%edx

  16: 8b 45 08             mov    0x8(%ebp),%eax

  19: 83 c0 04             add    $0x4,%eax

  1c: 89 54 24 04           mov    %edx,0x4(%esp)

  20: 89 04 24             mov    %eax,(%esp)

  23: e8 fc ff ff ff       call   24 <Word::Word(Word const&)+0x24>

  28: c9                   leave  

  29: c3                   ret    

---------------------------------------------------------------------------------------------------

不要Bitwise copy Semantics的四种情况:

1.当class内含一个member object而后者的class声明有一个copy constructor时

2.当class继承自一个base class 而后者存在有一个copy constructor时。

3.当class 声明了一个活多个virtual functions时。

4.当class派生自一个继承串链,其中有一个或多个virtual base classes时。

 

 

重新设定virtual table的指针

举例

//test.cpp

class ZooAnimal{

public:

  ZooAnimal();

  virtual ~ZooAnimal();

  virtual void animate();

  virtual void draw();

};

ZooAnimal::ZooAnimal(){}

ZooAnimal::~ZooAnimal(){}

void ZooAnimal::animate(){}

void ZooAnimal::draw(){}

class Bear:public ZooAnimal{

public:

  Bear();

  void animate();

  void draw();

  virtual void dance();

};

Bear::Bear(){}

void Bear::animate(){}

void Bear::draw(){}

void Bear::dance(){}

int main(){

  Bear yogi;

  Bear winnie = yogi;

  return 0;

}

 

反汇编

//objdump -dC test.o

08048504 <ZooAnimal::ZooAnimal()>:
 8048504: 55                   push   %ebp
 8048505: 89 e5                 mov    %esp,%ebp
 8048507: 8b 45 08             mov    0x8(%ebp),%eax
 804850a: c7 00 58 87 04 08     movl   $0x8048758,(%eax)
 8048510: 5d                   pop    %ebp
 8048511: c3                   ret    
08048512 <ZooAnimal::~ZooAnimal()>:
 8048512: 55                   push   %ebp
 8048513: 89 e5                 mov    %esp,%ebp
 8048515: 83 ec 18             sub    $0x18,%esp
 8048518: 8b 45 08             mov    0x8(%ebp),%eax
 804851b: c7 00 58 87 04 08     movl   $0x8048758,(%eax)
 8048521: b8 00 00 00 00       mov    $0x0,%eax
 8048526: 83 e0 01             and    $0x1,%eax
 8048529: 84 c0                 test   %al,%al
 804852b: 74 0b                 je     8048538 <ZooAnimal::~ZooAnimal()+0x26>
 804852d: 8b 45 08             mov    0x8(%ebp),%eax
 8048530: 89 04 24             mov    %eax,(%esp)
 8048533: e8 f0 fe ff ff       call   8048428 <operator delete(void*)@plt>
 8048538: c9                   leave  
 8048539: c3                   ret    
0804853a <ZooAnimal::~ZooAnimal()>:
 804853a: 55                   push   %ebp
 804853b: 89 e5                 mov    %esp,%ebp
 804853d: 83 ec 18             sub    $0x18,%esp
 8048540: 8b 45 08             mov    0x8(%ebp),%eax
 8048543: 89 04 24             mov    %eax,(%esp)
 8048546: e8 c7 ff ff ff       call   8048512 <ZooAnimal::~ZooAnimal()>
 804854b: 8b 45 08             mov    0x8(%ebp),%eax
 804854e: 89 04 24             mov    %eax,(%esp)
 8048551: e8 d2 fe ff ff       call   8048428 <operator delete(void*)@plt>
 8048556: c9                   leave  
 8048557: c3                   ret    
08048558 <ZooAnimal::animate()>:
 8048558: 55                   push   %ebp
 8048559: 89 e5                 mov    %esp,%ebp
 804855b: 5d                   pop    %ebp
 804855c: c3                   ret    
 804855d: 90                   nop
0804855e <ZooAnimal::draw()>:
 804855e: 55                   push   %ebp
 804855f: 89 e5                 mov    %esp,%ebp
 8048561: 5d                   pop    %ebp
 8048562: c3                   ret    
 8048563: 90                   nop
08048564 <Bear::Bear()>:
 8048564: 55                   push   %ebp
 8048565: 89 e5                 mov    %esp,%ebp
 8048567: 83 ec 04             sub    $0x4,%esp
 804856a: 8b 45 08             mov    0x8(%ebp),%eax
 804856d: 89 04 24             mov    %eax,(%esp)
 8048570: e8 8f ff ff ff       call   8048504 <ZooAnimal::ZooAnimal()>
 8048575: 8b 45 08             mov    0x8(%ebp),%eax
 8048578: c7 00 38 87 04 08     movl   $0x8048738,(%eax)
 804857e: c9                   leave  
 804857f: c3                   ret    
08048580 <Bear::animate()>:
 8048580: 55                   push   %ebp
 8048581: 89 e5                 mov    %esp,%ebp
 8048583: 5d                   pop    %ebp
 8048584: c3                   ret    
 8048585: 90                   nop
08048586 <Bear::draw()>:
 8048586: 55                   push   %ebp
 8048587: 89 e5                 mov    %esp,%ebp
 8048589: 5d                   pop    %ebp
 804858a: c3                   ret    
 804858b: 90                   nop
0804858c <Bear::dance()>:
 804858c: 55                   push   %ebp
 804858d: 89 e5                 mov    %esp,%ebp
 804858f: 5d                   pop    %ebp
 8048590: c3                   ret    
08048591 <main>:
 8048591: 55                   push   %ebp
 8048592: 89 e5                 mov    %esp,%ebp
 8048594: 83 e4 f0             and    $0xfffffff0,%esp
 8048597: 53                   push   %ebx
 8048598: 83 ec 2c             sub    $0x2c,%esp
 804859b: 8d 44 24 1c           lea    0x1c(%esp),%eax
 804859f: 89 04 24             mov    %eax,(%esp)
 80485a2: e8 bd ff ff ff       call   8048564 <Bear::Bear()>
 80485a7: 8d 44 24 1c           lea    0x1c(%esp),%eax
 80485ab: 89 44 24 04           mov    %eax,0x4(%esp)
 80485af: 8d 44 24 18           lea    0x18(%esp),%eax
 80485b3: 89 04 24             mov    %eax,(%esp)
 80485b6: e8 87 00 00 00       call   8048642 <Bear::Bear(Bear const&)>
 80485bb: bb 00 00 00 00       mov    $0x0,%ebx
 80485c0: 8d 44 24 18           lea    0x18(%esp),%eax
 80485c4: 89 04 24             mov    %eax,(%esp)
 80485c7: e8 16 00 00 00       call   80485e2 <Bear::~Bear()>
 80485cc: 8d 44 24 1c           lea    0x1c(%esp),%eax
 80485d0: 89 04 24             mov    %eax,(%esp)
 80485d3: e8 0a 00 00 00       call   80485e2 <Bear::~Bear()>
 80485d8: 89 d8                 mov    %ebx,%eax
 80485da: 83 c4 2c             add    $0x2c,%esp
 80485dd: 5b                   pop    %ebx
 80485de: 89 ec                 mov    %ebp,%esp
 80485e0: 5d                   pop    %ebp
 80485e1: c3                   ret    
080485e2 <Bear::~Bear()>:
 80485e2: 55                   push   %ebp
 80485e3: 89 e5                 mov    %esp,%ebp
 80485e5: 83 ec 18             sub    $0x18,%esp
 80485e8: 8b 45 08             mov    0x8(%ebp),%eax
 80485eb: c7 00 38 87 04 08     movl   $0x8048738,(%eax)
 80485f1: 8b 45 08             mov    0x8(%ebp),%eax
 80485f4: 89 04 24             mov    %eax,(%esp)
 80485f7: e8 16 ff ff ff       call   8048512 <ZooAnimal::~ZooAnimal()>
 80485fc: b8 00 00 00 00       mov    $0x0,%eax
 8048601: 83 e0 01             and    $0x1,%eax
 8048604: 84 c0                 test   %al,%al
 8048606: 74 0b                 je     8048613 <Bear::~Bear()+0x31>
 8048608: 8b 45 08             mov    0x8(%ebp),%eax
 804860b: 89 04 24             mov    %eax,(%esp)
 804860e: e8 15 fe ff ff       call   8048428 <operator delete(void*)@plt>
 8048613: c9                   leave  
 8048614: c3                   ret    
 8048615: 90                   nop
08048616 <Bear::~Bear()>:
 8048616: 55                   push   %ebp
 8048617: 89 e5                 mov    %esp,%ebp
 8048619: 83 ec 18             sub    $0x18,%esp
 804861c: 8b 45 08             mov    0x8(%ebp),%eax
 804861f: 89 04 24             mov    %eax,(%esp)
 8048622: e8 bb ff ff ff       call   80485e2 <Bear::~Bear()>
 8048627: 8b 45 08             mov    0x8(%ebp),%eax
 804862a: 89 04 24             mov    %eax,(%esp)
 804862d: e8 f6 fd ff ff       call   8048428 <operator delete(void*)@plt>
 8048632: c9                   leave  
 8048633: c3                   ret    
08048634 <ZooAnimal::ZooAnimal(ZooAnimal const&)>:
 8048634: 55                   push   %ebp
 8048635: 89 e5                 mov    %esp,%ebp
 8048637: 8b 45 08             mov    0x8(%ebp),%eax
 804863a: c7 00 58 87 04 08     movl   $0x8048758,(%eax)
 8048640: 5d                   pop    %ebp
 8048641: c3                   ret    
08048642 <Bear::Bear(Bear const&)>:
 8048642: 55                   push   %ebp
 8048643: 89 e5                 mov    %esp,%ebp
 8048645: 83 ec 18             sub    $0x18,%esp
 8048648: 8b 55 0c             mov    0xc(%ebp),%edx
 804864b: 8b 45 08             mov    0x8(%ebp),%eax
 804864e: 89 54 24 04           mov    %edx,0x4(%esp)
 8048652: 89 04 24             mov    %eax,(%esp)
 8048655: e8 da ff ff ff       call   8048634 <ZooAnimal::ZooAnimal(ZooAnimal const&)>
 804865a: 8b 45 08             mov    0x8(%ebp),%eax
 804865d: c7 00 38 87 04 08     movl   $0x8048738,(%eax)
 8048663: c9                   leave  
 8048664: c3                   ret    
 8048665: 90                   nop
 8048666: 90                   nop
 8048667: 90                   nop
 8048668: 90                   nop
 8048669: 90                   nop
 804866a: 90                   nop
 804866b: 90                   nop
 804866c: 90                   nop
 804866d: 90                   nop
 804866e: 90                   nop
 804866f: 90                   nop

// 构建了 ZooAnimal和Bear的复制构造函数。

 

 

当发生切割时

举例

//test.cpp

#include"animal.h"

int main(){

  Bear yogi;

  ZooAnimal franny = yogi;

  return 0;

}

//animal.cpp
#include"animal.h"
ZooAnimal::ZooAnimal(){}
ZooAnimal::~ZooAnimal(){}
void ZooAnimal::animate(){}
void ZooAnimal::draw(){}
Bear::Bear(){}
void Bear::animate(){}
void Bear::draw(){}
void Bear::dance(){}
//animal.h
class ZooAnimal{
public:
  ZooAnimal();
  virtual ~ZooAnimal();
  virtual void animate();
  virtual void draw();
};
class Bear:public ZooAnimal{
public:
  Bear();
  void animate();
  void draw();
  virtual void dance();
};

 

//反汇编

objdump -dC test.o

test.o:     file format elf32-i386

 

 

Disassembly of section .text:

 

00000000 <main>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 e4 f0             and    $0xfffffff0,%esp

   6: 53                   push   %ebx

   7: 83 ec 2c             sub    $0x2c,%esp

   a: 8d 44 24 1c           lea    0x1c(%esp),%eax

   e: 89 04 24             mov    %eax,(%esp)

  11: e8 fc ff ff ff       call   12 <main+0x12>

  16: 8d 44 24 1c           lea    0x1c(%esp),%eax

  1a: 89 44 24 04           mov    %eax,0x4(%esp)

  1e: 8d 44 24 18           lea    0x18(%esp),%eax

  22: 89 04 24             mov    %eax,(%esp)

  25: e8 fc ff ff ff       call   26 <main+0x26>

  2a: bb 00 00 00 00       mov    $0x0,%ebx

  2f: 8d 44 24 18           lea    0x18(%esp),%eax

  33: 89 04 24             mov    %eax,(%esp)

  36: e8 fc ff ff ff       call   37 <main+0x37>

  3b: 8d 44 24 1c           lea    0x1c(%esp),%eax

  3f: 89 04 24             mov    %eax,(%esp)

  42: e8 fc ff ff ff       call   43 <main+0x43>

  47: 89 d8                 mov    %ebx,%eax

  49: 83 c4 2c             add    $0x2c,%esp

  4c: 5b                   pop    %ebx

  4d: 89 ec                 mov    %ebp,%esp

  4f: 5d                   pop    %ebp

  50: c3                   ret    

  51: 89 c3                 mov    %eax,%ebx

  53: 8d 44 24 1c           lea    0x1c(%esp),%eax

  57: 89 04 24             mov    %eax,(%esp)

  5a: e8 fc ff ff ff       call   5b <main+0x5b>

  5f: 89 d8                 mov    %ebx,%eax

  61: 89 04 24             mov    %eax,(%esp)

  64: e8 fc ff ff ff       call   65 <main+0x65>

 

Disassembly of section .text._ZN4BearD2Ev:

 

00000000 <Bear::~Bear()>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 ec 18             sub    $0x18,%esp

   6: 8b 45 08             mov    0x8(%ebp),%eax

   9: c7 00 08 00 00 00     movl   $0x8,(%eax)

   f: 8b 45 08             mov    0x8(%ebp),%eax

  12: 89 04 24             mov    %eax,(%esp)

  15: e8 fc ff ff ff       call   16 <Bear::~Bear()+0x16>

  1a: b8 00 00 00 00       mov    $0x0,%eax

  1f: 83 e0 01             and    $0x1,%eax

  22: 84 c0                 test   %al,%al

  24: 74 0b                 je     31 <Bear::~Bear()+0x31>

  26: 8b 45 08             mov    0x8(%ebp),%eax

  29: 89 04 24             mov    %eax,(%esp)

  2c: e8 fc ff ff ff       call   2d <Bear::~Bear()+0x2d>

  31: c9                   leave  

  32: c3                   ret    

 

Disassembly of section .text._ZN4BearD0Ev:

 

00000000 <Bear::~Bear()>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 83 ec 18             sub    $0x18,%esp

   6: 8b 45 08             mov    0x8(%ebp),%eax

   9: 89 04 24             mov    %eax,(%esp)

   c: e8 fc ff ff ff       call   d <Bear::~Bear()+0xd>

  11: 8b 45 08             mov    0x8(%ebp),%eax

  14: 89 04 24             mov    %eax,(%esp)

  17: e8 fc ff ff ff       call   18 <Bear::~Bear()+0x18>

  1c: c9                   leave  

  1d: c3                   ret    

 

Disassembly of section .text._ZN9ZooAnimalC2ERKS_:

 

00000000 <ZooAnimal::ZooAnimal(ZooAnimal const&)>:

   0: 55                   push   %ebp

   1: 89 e5                 mov    %esp,%ebp

   3: 8b 45 08             mov    0x8(%ebp),%eax

   6: c7 00 08 00 00 00     movl   $0x8,(%eax)

   c: 5d                   pop    %ebp

   d: c3                   ret    

// 反汇编objdump -dC animal.o
animal.o:     file format elf32-i386
Disassembly of section .text:
00000000 <ZooAnimal::ZooAnimal()>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 8b 45 08             mov    0x8(%ebp),%eax
   6: c7 00 08 00 00 00     movl   $0x8,(%eax)
   c: 5d                   pop    %ebp
   d: c3                   ret    
0000000e <ZooAnimal::~ZooAnimal()>:
   e: 55                   push   %ebp
   f: 89 e5                 mov    %esp,%ebp
  11: 83 ec 18             sub    $0x18,%esp
  14: 8b 45 08             mov    0x8(%ebp),%eax
  17: c7 00 08 00 00 00     movl   $0x8,(%eax)
  1d: b8 00 00 00 00       mov    $0x0,%eax
  22: 83 e0 01             and    $0x1,%eax
  25: 84 c0                 test   %al,%al
  27: 74 0b                 je     34 <ZooAnimal::~ZooAnimal()+0x26>
  29: 8b 45 08             mov    0x8(%ebp),%eax
  2c: 89 04 24             mov    %eax,(%esp)
  2f: e8 fc ff ff ff       call   30 <ZooAnimal::~ZooAnimal()+0x22>
  34: c9                   leave  
  35: c3                   ret    
00000036 <ZooAnimal::~ZooAnimal()>:
  36: 55                   push   %ebp
  37: 89 e5                 mov    %esp,%ebp
  39: 83 ec 18             sub    $0x18,%esp
  3c: 8b 45 08             mov    0x8(%ebp),%eax
  3f: 89 04 24             mov    %eax,(%esp)
  42: e8 fc ff ff ff       call   43 <ZooAnimal::~ZooAnimal()+0xd>
  47: 8b 45 08             mov    0x8(%ebp),%eax
  4a: 89 04 24             mov    %eax,(%esp)
  4d: e8 fc ff ff ff       call   4e <ZooAnimal::~ZooAnimal()+0x18>
  52: c9                   leave  
  53: c3                   ret    
00000054 <ZooAnimal::animate()>:
  54: 55                   push   %ebp
  55: 89 e5                 mov    %esp,%ebp
  57: 5d                   pop    %ebp
  58: c3                   ret    
  59: 90                   nop
0000005a <ZooAnimal::draw()>:
  5a: 55                   push   %ebp
  5b: 89 e5                 mov    %esp,%ebp
  5d: 5d                   pop    %ebp
  5e: c3                   ret    
  5f: 90                   nop
00000060 <Bear::Bear()>:
  60: 55                   push   %ebp
  61: 89 e5                 mov    %esp,%ebp
  63: 83 ec 04             sub    $0x4,%esp
  66: 8b 45 08             mov    0x8(%ebp),%eax
  69: 89 04 24             mov    %eax,(%esp)
  6c: e8 fc ff ff ff       call   6d <Bear::Bear()+0xd>
  71: 8b 45 08             mov    0x8(%ebp),%eax
  74: c7 00 08 00 00 00     movl   $0x8,(%eax)
  7a: c9                   leave  
  7b: c3                   ret    
0000007c <Bear::animate()>:
  7c: 55                   push   %ebp
  7d: 89 e5                 mov    %esp,%ebp
  7f: 5d                   pop    %ebp
  80: c3                   ret    
  81: 90                   nop
00000082 <Bear::draw()>:
  82: 55                   push   %ebp
  83: 89 e5                 mov    %esp,%ebp
  85: 5d                   pop    %ebp
  86: c3                   ret    
  87: 90                   nop
00000088 <Bear::dance()>:
  88: 55                   push   %ebp
  89: 89 e5                 mov    %esp,%ebp
  8b: 5d                   pop    %ebp
  8c: c3                   ret    
Disassembly of section .text._ZN4BearD2Ev:
00000000 <Bear::~Bear()>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 83 ec 18             sub    $0x18,%esp
   6: 8b 45 08             mov    0x8(%ebp),%eax
   9: c7 00 08 00 00 00     movl   $0x8,(%eax)
   f: 8b 45 08             mov    0x8(%ebp),%eax
  12: 89 04 24             mov    %eax,(%esp)
  15: e8 fc ff ff ff       call   16 <Bear::~Bear()+0x16>
  1a: b8 00 00 00 00       mov    $0x0,%eax
  1f: 83 e0 01             and    $0x1,%eax
  22: 84 c0                 test   %al,%al
  24: 74 0b                 je     31 <Bear::~Bear()+0x31>
  26: 8b 45 08             mov    0x8(%ebp),%eax
  29: 89 04 24             mov    %eax,(%esp)
  2c: e8 fc ff ff ff       call   2d <Bear::~Bear()+0x2d>
  31: c9                   leave  
  32: c3                   ret    
Disassembly of section .text._ZN4BearD0Ev:
00000000 <Bear::~Bear()>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 83 ec 18             sub    $0x18,%esp
   6: 8b 45 08             mov    0x8(%ebp),%eax
   9: 89 04 24             mov    %eax,(%esp)
   c: e8 fc ff ff ff       call   d <Bear::~Bear()+0xd>
  11: 8b 45 08             mov    0x8(%ebp),%eax
  14: 89 04 24             mov    %eax,(%esp)
  17: e8 fc ff ff ff       call   18 <Bear::~Bear()+0x18>
  1c: c9                   leave  
  1d: c3                   ret    
//编译器只产生了ZooAnimal的copy constructor。
//编译器在需要constructor的每个目标文件中产生此constructor副本。
处理virtual base class subobject
一个class object如果以另一个object作为初值,而后者有一个virtual base class subobject,那么也会使"bitwise copy semantics"失效。
编译器,必须让“derived class object中的virtual base class subobject位置”在执行期准备妥当。“bitwise copy constructor"可能会破坏这个位置,所以编译器必须在它自己合成出来的copy constructor中做出裁决。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值