聊聊 C++ 中几类特殊成员函数

一:背景在C#中要说类默认给我们定义的特殊成员函数,莫过于构造函数,但在C++中这样的特殊函数高达6种,有必要整合一下聊一聊。二:特殊成员函数1.默认构造函数和C#一样,很多书中都说,如果用户没有定义

一:背景

在 C# 中要说默认给我们定义的特殊成员函数,莫过于 构造函数,但在 C++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊。

二:特殊成员函数

1. 默认构造函数

和 C# 一样,很多书中都说,如果用户没有定义 构造函数,那么编译器会给我们定义一个,参考下面的例子:

class Person {public:string name;int age;};int main(){Person person;}

接下来观察下汇编代码,看下有没有调用 默认构造函数 .

Person person;003E32EF  lea         ecx,[person]  003E32F2  call        Person::Person (03E15EBh)

对于 C# 学习者来说有点懵哈,定义了就相当于new了, 哈哈,这是因为 C++ 默认都是值类型哈,不过这里有必要澄清一下,并不一定所有情况都会调用 默认构造函数,因为 C++ 的汇编生成由各自 编译器 来决定,如果 编译器 觉得没必要调用 构造函数 那它就会把这一步省掉来加速性能,那什么时候不会调呢? 参考如下代码。

class Person {public:void show() {printf("show!");}};int main(){Person person;person.show();}

接下来看下汇编代码。

person.show();00E73F4F  lea         ecx,[person]  00E73F52  call        Person::show (0E713B6h) 

可以清楚的看到,这种情况下调用 构造函数 其实没有必要,所以编译器就干脆省略了。

2. 析构函数

在 C# 中 析构函数 是由 CLR 负责管理,在 C++ 中没有托管这个概念,所以默认只能是结束作用域之前,自动调用 析构函数 释放,参考如下图:

聊聊 C++ 中几类特殊成员函数

3. 赋值构造函数

刚才也说到了,在 C++ 中甭管是 class 还是 struct 默认都是值类型,既然是值类型就存在stack copy 的情况,在 C# 中也是因为重写了 EqualsGetHashCode 来实现的值copy,接下来简单看下代码:

class Person {public:string name;int age;};int main(){Person p1 = { "jack",20 };Person p2(p1);}

再看下 Person p2(p1) 的汇编代码。

Person p2(p1);000F80A2  lea         eax,[p1]  000F80A5  push        eax  000F80A6  lea         ecx,[p2]  000F80A9  call        Person::Person (0F15C3h) 

从汇编中可以看到调用了 Person::Person (0F15C3h) 函数,请注意,这个不是 构造函数,而是 赋值构造函数

本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
开发者

Springboot怎么整合RabbitMQ消息队列

2025-5-28 7:15:50

开发者

Bash脚本debug攻略

2025-5-28 7:19:12

搜索