聊聊 C++ 中几类特殊成员函数
2022/7/13 1:25:50
本文主要是介绍聊聊 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++ 中没有托管这个概念,所以默认只能是结束作用域之前,自动调用 析构函数
释放,参考如下图:
3. 赋值构造函数
刚才也说到了,在 C++ 中甭管是 class 还是 struct 默认都是值类型,既然是值类型就存在stack copy
的情况,在 C# 中也是因为重写了 Equals
和 GetHashCode
来实现的值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)
函数,请注意,这个不是 构造函数
,而是 赋值构造函数
这篇关于聊聊 C++ 中几类特殊成员函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升