pdf文档 Calling Functions A Tutorial

5.11 MB 111 页 0 评论
语言 格式 评分
英语
.pdf
3
摘要
文档系统阐述了C++中调用函数的基本机制,涵盖了函数重载解析、函数模板特化、虚拟调度、访问标签、名称查找和删除函数等核心主题。通过具体示例,展示了如何根据输入类型选择合适的函数版本,以及如何利用函数模板特化和删除函数来定制和限制函数行为。
AI总结
以下是对文档《Calling Functions A Tutorial》的中文总结,语言简洁明了,重点突出核心观点和关键信息,逻辑连贯: --- ### 《Calling Functions A Tutorial》总结 本文档是Klaus Iglberger在CppCon 2020上发表的关于C++函数调用机制的教程,旨在揭示函数调用中的基本原理和一些细微且令人惊讶的细节。以下是核心内容的总结: #### 1. **函数调用解析(Function Overload Resolution)** - 当多个函数重载(overload)存在时,编译器会根据参数类型和数量选择最匹配的函数。 - 示例: ```cpp void f(int); // (1) void f(double) = delete; // (2) int main() { f(42); // 调用函数 (1) f(1.0); // 编译错误:调用已删除的函数 } ``` #### 2. **函数模板特化(Function Template Specialization)** - 函数模板的特化(specialization)优先于一般模板。 - 示例: ```cpp template void f(T); // (1) template<> void f(char*); // (2) template void f(T*); // (3) int main() { char* cp{nullptr}; f(cp); // 调用函数 (3),而非 (2) } ``` - 注意:函数模板的特化需要显式声明。 #### 3. **虚函数调度(Virtual Dispatch)** - 虚函数在运行时解析,依赖于对象的实际类型。 - 示例: ```cpp class Base { public: virtual void f() { /* 基类实现 */ } }; class Derived : public Base { public: void f() override { /* 派生类实现 */ } }; int main() { Base* p = new Derived(); p->f(); // 调用派生类的实现 } ``` #### 4. **函数删除(Deleting Functions)** - 使用 `= delete` 关键字可以禁止某些函数调用。 - 示例: ```cpp void f(int); // (1) void f(double) = delete; // (2) int main() { f(42); // 调用函数 (1) f(1.0); // 编译错误:调用已删除的函数 } ``` #### 5. **其他机制** - **访问标签(Access Labels)**:控制成员函数的访问权限。 - **名称查找(Name Lookup)**:根据作用域和上下文确定函数的定义。 - **函数重载与模板特化的关系**:函数重载优先于模板特化。例如: ```cpp template void f(T*); // (3) template<> void f(char*); // (2) int main() { char* cp{nullptr}; f(cp); // 调用函数 (3),而非 (2) } ``` 根据Guidelines 95,建议优先使用函数重载而非模板特化。 --- 本总结概括了函数调用中的关键机制和细节,涵盖了函数重载、模板特化、虚函数调度、函数删除等内容,并通过具体示例说明了每种机制的使用和注意事项。
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余 99 页请下载阅读 -
文档评分
请文明评论,理性发言.