cpp学习-第七章-类

核心简记

  1. 类的基本思想是数据抽象与封装。接口与实现分离。
  2. 类的编译先编译成员声明再编译函数体
  3. 函数在概念上属于类但不定义在类的要声明在同一头文件中,实现在同一cpp文件中。
  4. 构造函数名字与类相同,无返回值。构造函数不能为const,直到构造函数完成初始化过程,对象才有常量属性。
  5. struct与class唯一的区别是默认访问权限。struct为public
  6. 使用时c++式与c式的class 类名,等价。
  7. 类的声明是class 类名,定义前的类是不完整的,可以定义其指针与引用,只有当类完成后才算定义。
  8. ::表示全局
  9. 构造函数中对象成员初始化时机:初始化类表、默认初始化。函数体执行前已经是初始化好的了。函数体内是赋值操作
  10. 构造函数成员的初始化顺序与类定义中顺序一致,与初始值列表无关。
  11. 构造函数可以提供默认实参,全部参时可以省去默认构造

定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
h:
class A;
#include<string>
class A{
friend A foutside2(A a);//友元
private:
int num1=1;
std::string str="123";
//std::string str("123");必须是=或者{}
public:
typedef int myint; //类型成员
static int sta;
int fside(int a)//方法,内联
{
int d=a+num1;
return d;
}
int foutside(int a) const;//方法外部定义
A(int i):num1(i){}//列表初始化,内联
A()=default;//内联默认初始化
};
A foutside2(A a);
cpp:
A foutside2(A a)
{
return a;
}
int A::foutside(int a) const
{
int d=a+num1;
return d;
}
int A::sta =1;

这是类的定义。数据为声明。成员函数的声明必须在类内部,定义可内可外,定义在内部为隐式inline。因为类的定义放在头文件为编译器识别用的接口,而实现在.cpp文件中,.h被每个使用者包含,因此识别出的定义可以用于inline。这与inline应该定义在头文件是一致的。
调用方法时传入对象地址作为this。this为一个常量指针,不可更改this。在成员函数参数列表后加const关键字,可以使指针指向常量。对于初始化时的拷贝,底层忽略const因为初始化为拷贝底层,const对拷贝没有影响,而顶层const的类型是需要符合才可以拷贝的。当this指向常量时,普通对象可用常量成员函数,但常量对象不能使用普通函数。常量对象只能调用常量成员函数。
如果没有定义构造函数将生成默认构造函数,默认构造初始化规则:类内初始值、默认初始化。
可以用=defult;生层默认构造函数,可以写在声明或定义。写在声明为内联。
构造函数参数列表后可以加:构造函数初始值列表。可以为对象成员赋初始值。成员被忽略时将以合成默认构造相同方式初始化。一旦进入构造函数的函数体,成员已经初始化了。
public为整个程序可访问,private是仅类内。
类可以声明友元让其访问私有成员。友元不是类的成员,其仅仅是访问权限的指定,不是一个完整声明,因此该函数必须再声明一次。
类可以有类型成员,通过::在外部使用。
类成员函数inline修饰在声明与定义都可以,但都要在.h内。因为内联要函数定义,需要在一个模块内被编译器识别到。
成员函数可以重载
类的成员用mutable修饰可以成为可变数据,即使在const对象中也可被修改。
类内初始值必须以=或者{}表示。
返回值为this的引用可以在之后连用.。一般的返回为拷贝,会对临时量使用.
一个const的成员函数以引用形式返回
this返回的将是常量引用,此时可以定义俩个版本的包装函数封调用非const版本,一个返回为const引用,一个为普通引用。为顶层可区分

友元:

1
2
3
4
class A{
friend class B;
friend void C::f();
};

可以声明友元类,不存在传递性。每个类控制自己的友元。注意友元只是影响权限,并不是声明。

类的作用域:类的作用域外数据与成员使用访问运算符访问,类型成员使用作用域运算符。函数定义时,一旦遇到类名,定义的剩余部分就在类的作用域之内了,但返回类型在函数名前,所以返回类型要加作用域。
编译时类定义顺序:先编译成员声明、再编译函数体。注意只是函数体,声明中的名字要之前可见。同时类型名要特殊,内外不可同名。
成员定义的名字查找方式:函数体内使用前、类内、函数定义前。函数定义前不仅是类定义前,还有函数定义前也算。

委托构造:

1
2
3
4
5
6
7
class A{
int Aa;
int Ab;
A(int a,int b):Aa(a),Ab(b){}//可以对string等使用其类的构造
A():A(0,0){}
};

初始列表只有其它构造函数,传入参即可。受委托的构造函数初始值列表和函数体依次被执行,之后再执行委托者的函数体。

使用默认构造时:

1
2
A a();//错误,a为函数声明
A a;

默认构造不加()。

隐式类型转化:
如果有构造只接受一个参数,就定义了一个隐式转化机制。其只允许一步转化。在赋值或参数传递时都可发生使用。使用explicit声明构造函数时阻止作为转化。
拷贝初始化与直接初始化是不同的,拷贝初始化会执行转化过程,直接初始化为直接使用构造。

聚合类:
聚合类所有成员public、没有构造、没有类内初始值等。作为数据集合。可以使用列表初始化它。

静态成员:
可以是函数、数据。使用作用域运算符直接访问,也可对象使用访问运算符。
定义静态成员函数时,声明加static,定义不加。数据类型必须定义初始化在外部。由于数据类内只是声明,因此定义在外部,同时static也只加在声明。

反汇编

.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class A;
#include<string>
class A{
friend A foutside2(A a);//友元
private:
int num1=1;
std::string str="123";
//std::string str("123");必须是=或者{}
public:
typedef int myint; //类型成员
static int sta;
int fside(int a)//方法,内联
{
int d=a+num1;
return d;
}
int foutside(int a) const;//方法外部定义
A(int i):num1(i){}//列表初始化,内联
A()=default;//内联默认初始化
};
A foutside2(A a);

.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include"7.h"
#include<iostream>
A foutside2(A a)
{
return a;
}
int A::foutside(int a) const
{
int d=a+num1;
return d;
}
int A::sta =1;
int main(int argc, char const *argv[])
{
A a;
A a2=3;
int re;
re=a.fside(1);
re=a.foutside(2);
re=A::sta;
//可以强改的
std::cin>>re;
const int con=re;
int *cls=(int *)&con;
*cls=1;
re=con;
std::cout<<re;
return 0;
}

x86-64

指令简记

分析

main:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
.text:0000000000007A90 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000007A90 main proc near ; DATA XREF: start+2E↑o
.text:0000000000007A90
.text:0000000000007A90 var_6C = dword ptr -6Ch
.text:0000000000007A90 var_68 = qword ptr -68h
.text:0000000000007A90 var_60 = qword ptr -60h
.text:0000000000007A90 var_58 = qword ptr -58h
.text:0000000000007A90 var_50 = qword ptr -50h
.text:0000000000007A90 var_48 = qword ptr -48h
.text:0000000000007A90 var_40 = qword ptr -40h
.text:0000000000007A90 var_38 = dword ptr -38h
.text:0000000000007A90 var_34 = dword ptr -34h
.text:0000000000007A90 var_30 = dword ptr -30h
.text:0000000000007A90 var_2C = dword ptr -2Ch
.text:0000000000007A90 var_28 = byte ptr -28h
.text:0000000000007A90 var_18 = byte ptr -18h
.text:0000000000007A90 var_8 = qword ptr -8
.text:0000000000007A90
.text:0000000000007A90 ; __unwind {
.text:0000000000007A90 push rbp
.text:0000000000007A91 mov rbp, rsp
.text:0000000000007A94 sub rsp, 70h
.text:0000000000007A98 mov rax, fs:28h
.text:0000000000007AA1 mov [rbp+var_8], rax
.text:0000000000007AA5 mov [rbp+var_34], 0
.text:0000000000007AAC mov [rbp+var_38], edi
.text:0000000000007AAF mov [rbp+var_40], rsi
//初始化a var_50是a的指针 该构造并没有内联
.text:0000000000007AB3 lea rax, [rbp+var_18]
.text:0000000000007AB7 mov rdi, rax
.text:0000000000007ABA mov [rbp+var_50], rax
.text:0000000000007ABE call sub_7B90
//初始化 var_58为a2指针 构造依然不是内联
.text:0000000000007AC3 lea rax, [rbp+var_28]
.text:0000000000007AC7 mov esi, 3
.text:0000000000007ACC mov rdi, rax
.text:0000000000007ACF mov [rbp+var_58], rax
.text:0000000000007AD3 call sub_7C10
//re=a.fside(1);
.text:0000000000007AD8 mov esi, 1
.text:0000000000007ADD mov rdi, [rbp+var_50]
.text:0000000000007AE1 call sub_7C90
.text:0000000000007AE6 mov [rbp+var_2C], eax
//re=a.foutside(2);
.text:0000000000007AE9 mov esi, 2
.text:0000000000007AEE mov rdi, [rbp+var_50]
.text:0000000000007AF2 call sub_7A70
.text:0000000000007AF7 mov [rbp+var_2C], eax
// re=A::sta; 初始化了的静态成员为 data直接写入
.text:0000000000007AFA mov eax, cs:dword_59000
.text:0000000000007B00 mov [rbp+var_2C], eax
// 后面不看了
.text:0000000000007B03 lea rdi, unk_59D80
.text:0000000000007B0A lea rsi, [rbp+var_2C]
.text:0000000000007B0E call sub_88A0
.text:0000000000007B13 mov ecx, [rbp+var_2C]
.text:0000000000007B16 mov [rbp+var_30], ecx
.text:0000000000007B19 lea rsi, [rbp+var_30]
.text:0000000000007B1D mov [rbp+var_48], rsi
.text:0000000000007B21 mov rsi, [rbp+var_48]
.text:0000000000007B25 mov dword ptr [rsi], 1
.text:0000000000007B2B mov ecx, [rbp+var_30]
.text:0000000000007B2E mov [rbp+var_2C], ecx
.text:0000000000007B31 mov esi, [rbp+var_2C]
.text:0000000000007B34 lea rdi, unk_59C40
.text:0000000000007B3B mov [rbp+var_60], rax
.text:0000000000007B3F call sub_1C260
.text:0000000000007B44 mov [rbp+var_34], 0
//析构自动生成的
.text:0000000000007B4B mov rdi, [rbp+var_58]
.text:0000000000007B4F mov [rbp+var_68], rax
.text:0000000000007B53 call sub_7CB0
.text:0000000000007B58 mov rdi, [rbp+var_50]
.text:0000000000007B5C call sub_7CB0
.text:0000000000007B61 mov eax, [rbp+var_34]
.text:0000000000007B64 mov rdi, fs:28h
.text:0000000000007B6D mov rdx, [rbp+var_8]
.text:0000000000007B71 cmp rdi, rdx
.text:0000000000007B74 mov [rbp+var_6C], eax
.text:0000000000007B77 jnz loc_7B86
.text:0000000000007B7D mov eax, [rbp+var_6C]
.text:0000000000007B80 add rsp, 70h
.text:0000000000007B84 pop rbp
.text:0000000000007B85 retn
.text:0000000000007B86 ; ---------------------------------------------------------------------------
.text:0000000000007B86
.text:0000000000007B86 loc_7B86: ; CODE XREF: main+E7↑j
.text:0000000000007B86 call ___stack_chk_fail
.text:0000000000007B86 ; } // starts at 7A90
.text:0000000000007B86 main endp

sub_7B90

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.text:0000000000007B90 sub_7B90 proc near ; CODE XREF: main+2E↑p
.text:0000000000007B90
.text:0000000000007B90 var_28 = qword ptr -28h
.text:0000000000007B90 var_20 = qword ptr -20h
.text:0000000000007B90 var_18 = qword ptr -18h
.text:0000000000007B90 var_10 = byte ptr -10h
.text:0000000000007B90 var_8 = qword ptr -8
.text:0000000000007B90
.text:0000000000007B90 ; __unwind {
.text:0000000000007B90 push rbp
.text:0000000000007B91 mov rbp, rsp
.text:0000000000007B94 sub rsp, 30h
.text:0000000000007B98 mov rax, fs:28h
.text:0000000000007BA1 mov [rbp+var_8], rax
//初始化为1,传入的是this
.text:0000000000007BA5 mov [rbp+var_18], rdi
.text:0000000000007BA9 mov rax, [rbp+var_18]
.text:0000000000007BAD mov dword ptr [rax], 1
.text:0000000000007BB3 add rax, 8
.text:0000000000007BB7 lea rdi, [rbp+var_10]
.text:0000000000007BBB mov [rbp+var_20], rdi
.text:0000000000007BBF mov [rbp+var_28], rax
.text:0000000000007BC3 call nullsub_1
//rsi为123 rdi为rax+8 初始化string
.text:0000000000007BC8 lea rsi, unk_444E0
.text:0000000000007BCF mov rdi, [rbp+var_28]
.text:0000000000007BD3 mov rdx, [rbp+var_20]
.text:0000000000007BD7 call sub_2DC80
.text:0000000000007BDC mov rdi, [rbp+var_20]
.text:0000000000007BE0 call nullsub_2
.text:0000000000007BE5 mov rax, fs:28h
.text:0000000000007BEE mov rdx, [rbp+var_8]
.text:0000000000007BF2 cmp rax, rdx
.text:0000000000007BF5 jnz loc_7C01
.text:0000000000007BFB add rsp, 30h
.text:0000000000007BFF pop rbp
.text:0000000000007C00 retn
.text:0000000000007C01 ; ---------------------------------------------------------------------------
.text:0000000000007C01
.text:0000000000007C01 loc_7C01: ; CODE XREF: sub_7B90+65↑j
.text:0000000000007C01 call ___stack_chk_fail
.text:0000000000007C01 ; } // starts at 7B90
.text:0000000000007C01 sub_7B90 endp

sub_7C10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.text:0000000000007C10 sub_7C10 proc near ; CODE XREF: main+43↑p
.text:0000000000007C10
.text:0000000000007C10 var_30 = qword ptr -30h
.text:0000000000007C10 var_28 = qword ptr -28h
.text:0000000000007C10 var_1C = dword ptr -1Ch
.text:0000000000007C10 var_18 = qword ptr -18h
.text:0000000000007C10 var_10 = byte ptr -10h
.text:0000000000007C10 var_8 = qword ptr -8
.text:0000000000007C10
.text:0000000000007C10 ; __unwind {
.text:0000000000007C10 push rbp
.text:0000000000007C11 mov rbp, rsp
.text:0000000000007C14 sub rsp, 30h
.text:0000000000007C18 mov rax, fs:28h
.text:0000000000007C21 mov [rbp+var_8], rax
.text:0000000000007C25 mov [rbp+var_18], rdi
.text:0000000000007C29 mov [rbp+var_1C], esi
.text:0000000000007C2C mov rax, [rbp+var_18]
.text:0000000000007C30 mov esi, [rbp+var_1C]
.text:0000000000007C33 mov [rax], esi //初始num1
.text:0000000000007C35 add rax, 8
.text:0000000000007C39 lea rdi, [rbp+var_10]
.text:0000000000007C3D mov [rbp+var_28], rdi
.text:0000000000007C41 mov [rbp+var_30], rax
.text:0000000000007C45 call nullsub_1
.text:0000000000007C4A lea rsi, unk_444E0
.text:0000000000007C51 mov rdi, [rbp+var_30]
.text:0000000000007C55 mov rdx, [rbp+var_28]
.text:0000000000007C59 call sub_2DC80 //初始string
.text:0000000000007C5E mov rdi, [rbp+var_28]
.text:0000000000007C62 call nullsub_2
.text:0000000000007C67 mov rax, fs:28h
.text:0000000000007C70 mov rdx, [rbp+var_8]
.text:0000000000007C74 cmp rax, rdx
.text:0000000000007C77 jnz loc_7C83
.text:0000000000007C7D add rsp, 30h
.text:0000000000007C81 pop rbp
.text:0000000000007C82 retn
.text:0000000000007C83 ; ---------------------------------------------------------------------------
.text:0000000000007C83
.text:0000000000007C83 loc_7C83: ; CODE XREF: sub_7C10+67↑j
.text:0000000000007C83 call ___stack_chk_fail
.text:0000000000007C83 ; } // starts at 7C10
.text:0000000000007C83 sub_7C10 endp
.text:0000000000007C83

sub_7C90 sub_7A70

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.text:0000000000007C90 sub_7C90 proc near ; CODE XREF: main+51↑p
.text:0000000000007C90
.text:0000000000007C90 var_10 = dword ptr -10h
.text:0000000000007C90 var_C = dword ptr -0Ch
.text:0000000000007C90 var_8 = qword ptr -8
.text:0000000000007C90
.text:0000000000007C90 ; __unwind {
.text:0000000000007C90 push rbp
.text:0000000000007C91 mov rbp, rsp
.text:0000000000007C94 mov [rbp+var_8], rdi
.text:0000000000007C98 mov [rbp+var_C], esi
.text:0000000000007C9B mov rdi, [rbp+var_8]
.text:0000000000007C9F mov esi, [rbp+var_C]
.text:0000000000007CA2 add esi, [rdi] //int d=a+num1;
.text:0000000000007CA4 mov [rbp+var_10], esi
.text:0000000000007CA7 mov eax, [rbp+var_10]
.text:0000000000007CAA pop rbp
.text:0000000000007CAB retn
.text:0000000000007CAB ; } // starts at 7C90
.text:0000000000007CAB sub_7C90 endp

ARM-64

指令简记

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
.text:0000000000008BFC ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000008BFC EXPORT main
.text:0000000000008BFC main ; DATA XREF: LOAD:0000000000000DB8↑o
.text:0000000000008BFC ; .got:main_ptr↓o
.text:0000000000008BFC
.text:0000000000008BFC var_5C = -0x5C
.text:0000000000008BFC var_58 = -0x58
.text:0000000000008BFC var_50 = -0x50
.text:0000000000008BFC var_48 = -0x48
.text:0000000000008BFC var_40 = -0x40
.text:0000000000008BFC var_38 = -0x38
.text:0000000000008BFC var_34 = -0x34
.text:0000000000008BFC var_30 = -0x30
.text:0000000000008BFC var_2C = -0x2C
.text:0000000000008BFC var_28 = -0x28
.text:0000000000008BFC var_18 = -0x18
.text:0000000000008BFC var_8 = -8
.text:0000000000008BFC var_s0 = 0
.text:0000000000008BFC
.text:0000000000008BFC ; __unwind {
.text:0000000000008BFC SUB SP, SP, #0x70
.text:0000000000008C00 STP X29, X30, [SP,#0x60+var_s0]
.text:0000000000008C04 ADD X29, SP, #0x60
.text:0000000000008C08 SUB X8, X29, #-var_18
.text:0000000000008C0C MRS X9, #3, c13, c0, #2
.text:0000000000008C10 LDR X9, [X9,#0x28]
.text:0000000000008C14 STUR X9, [X29,#var_8]
//a
.text:0000000000008C18 STR WZR, [SP,#0x60+var_34]
.text:0000000000008C1C STR W0, [SP,#0x60+var_38]
.text:0000000000008C20 STR X1, [SP,#0x60+var_40]
.text:0000000000008C24 MOV X0, X8
.text:0000000000008C28 BL sub_8D08
//a2
.text:0000000000008C2C SUB X0, X29, #-var_28
.text:0000000000008C30 MOV W1, #3
.text:0000000000008C34 BL sub_8D84
//re=a.fside(1);
.text:0000000000008C38 SUB X0, X29, #-var_18
.text:0000000000008C3C MOV W1, #1
.text:0000000000008C40 BL sub_8E04
.text:0000000000008C44 SUB X8, X29, #-var_18
.text:0000000000008C48 MOV W1, #2
.text:0000000000008C4C STUR W0, [X29,#var_2C]
.text:0000000000008C50 MOV X0, X8
//re=a.foutside(2);
.text:0000000000008C54 BL sub_8BD0
//re=A::sta;
.text:0000000000008C58 ADRP X8, #off_63F00@PAGE
.text:0000000000008C5C LDR X8, [X8,#off_63F00@PAGEOFF]
.text:0000000000008C60 SUB X1, X29, #-var_2C
.text:0000000000008C64 ADRP X9, #dword_64008@PAGE
.text:0000000000008C68 ADD X9, X9, #dword_64008@PAGEOFF
.text:0000000000008C6C STUR W0, [X29,#var_2C]
.text:0000000000008C70 LDR W0, [X9]
.text:0000000000008C74 STUR W0, [X29,#var_2C]
.text:0000000000008C78 MOV X0, X8
.text:0000000000008C7C BL sub_98A8
.text:0000000000008C80 ADRP X8, #off_63C88@PAGE
.text:0000000000008C84 LDR X8, [X8,#off_63C88@PAGEOFF]
.text:0000000000008C88 MOV W10, #1
.text:0000000000008C8C ADD X9, SP, #0x60+var_30
.text:0000000000008C90 LDUR W11, [X29,#var_2C]
.text:0000000000008C94 STR W11, [SP,#0x60+var_30]
.text:0000000000008C98 STR X9, [SP,#0x60+var_48]
.text:0000000000008C9C LDR X9, [SP,#0x60+var_48]
.text:0000000000008CA0 STR W10, [X9]
.text:0000000000008CA4 LDR W10, [SP,#0x60+var_30]
.text:0000000000008CA8 STUR W10, [X29,#var_2C]
.text:0000000000008CAC LDUR W1, [X29,#var_2C]
.text:0000000000008CB0 STR X0, [SP,#0x60+var_50]
.text:0000000000008CB4 MOV X0, X8
.text:0000000000008CB8 BL sub_1B5A0
//析构
.text:0000000000008CBC SUB X8, X29, #-var_28
.text:0000000000008CC0 STR WZR, [SP,#0x60+var_34]
.text:0000000000008CC4 STR X0, [SP,#0x60+var_58]
.text:0000000000008CC8 MOV X0, X8
.text:0000000000008CCC BL sub_8E30
.text:0000000000008CD0 SUB X0, X29, #-var_18
.text:0000000000008CD4 BL sub_8E30
.text:0000000000008CD8 LDR W0, [SP,#0x60+var_34]
.text:0000000000008CDC MRS X8, #3, c13, c0, #2
.text:0000000000008CE0 LDR X8, [X8,#0x28]
.text:0000000000008CE4 LDUR X9, [X29,#var_8]
.text:0000000000008CE8 CMP X8, X9
.text:0000000000008CEC STR W0, [SP,#0x60+var_5C]
.text:0000000000008CF0 B.NE loc_8D04
.text:0000000000008CF4 LDR W0, [SP,#0x60+var_5C]
.text:0000000000008CF8 LDP X29, X30, [SP,#0x60+var_s0]
.text:0000000000008CFC ADD SP, SP, #0x70
.text:0000000000008D00 RET
.text:0000000000008D04 ; ---------------------------------------------------------------------------
.text:0000000000008D04
.text:0000000000008D04 loc_8D04 ; CODE XREF: main+F4↑j
.text:0000000000008D04 BL .__stack_chk_fail
.text:0000000000008D04 ; } // starts at 8BFC
.text:0000000000008D04 ; End of function main

析构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:0000000000008E30 sub_8E30 ; CODE XREF: main+D0↑p
.text:0000000000008E30 ; main+D8↑p
.text:0000000000008E30
.text:0000000000008E30 var_8 = -8
.text:0000000000008E30 var_s0 = 0
.text:0000000000008E30
.text:0000000000008E30 ; __unwind {
.text:0000000000008E30 SUB SP, SP, #0x20
.text:0000000000008E34 STP X29, X30, [SP,#0x10+var_s0]
.text:0000000000008E38 ADD X29, SP, #0x10
.text:0000000000008E3C STR X0, [SP,#0x10+var_8]
.text:0000000000008E40 LDR X0, [SP,#0x10+var_8]
//对string执行析构
.text:0000000000008E44 ADD X0, X0, #8
.text:0000000000008E48 BL sub_2B26C
.text:0000000000008E4C LDP X29, X30, [SP,#0x10+var_s0]
.text:0000000000008E50 ADD SP, SP, #0x20
.text:0000000000008E54 RET
.text:0000000000008E54 ; } // starts at 8E30

构造与函数调用都要传对象地址作为this
默认析构是对每个成员析构
debug下并没有隐式内联…依然全部化为了函数调用。核心为找到this,确定数据结构