有三种情况,会以一个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中做出裁决。