何时通过引用或指针传递参数?2024 年 8 月 28 日 | 3 分钟阅读 在 C++ 中,由于以下原因,变量通过引用传递: 1) 更改调用者函数的局部变量: 引用(或指针)允许被调用函数修改调用者函数的局部变量。考虑以下示例程序,其中 fun() 可以更改 main() 的局部变量 x。 C++ 代码 输出 New value of x is 20 2) 传递大参数时: 传递大参数时,通过引用(或指针)传递更有效,因为只传递地址,而不是整个对象。考虑以下 Employee 类和函数 printEmpDetails(),它打印 Employee 详细信息。 C 代码 上述代码的问题在于: 每次调用 printEmpDetails() 时,都会构造一个新的 Employee 对象,这涉及到创建所有数据成员的副本。因此,更好的实现方式是将 Employee 作为引用传递。 这仅适用于结构体和类变量,因为像 int、char 等基本类型没有效率优势。 3) 避免对象切片: 如果我们将一个子类对象传递给一个期望超类对象的函数,如果按值传递,则传递的对象会被切片。考虑以下程序,它打印“This is Pet Class”。 C 代码 输出 This is Pet Class 当我们在上述程序中使用引用传递时,它会正确打印“ This is Dog Class ”。请参见下面的修改后的程序。 C++ 代码 输出 This is Dog Class 这对于 int、char 等基本数据类型也不适用。 4) 在函数中实现运行时多态性: 通过将对象作为引用(或指针)传递给函数,我们可以使其具有多态性。例如,在以下程序中,print() 接收基类对象的引用。如果传递基类对象,则函数 print() 调用基类函数 show(),如果传递派生类对象,则调用派生类函数 show()。 C++ 代码 输出 In base In derived *指针具有值,并且由于 C++ 中的函数参数默认按值传递,因此当你使用指针时,指针的副本会传递给函数。 结论如果参数很大(例如列表中的字符串),最好使用引用传递,以避免移动整个字符串。引用传递实际上只传递参数的地址,而不是参数本身。 |
? 运行时类型信息(RTTI),也称为运行时类型识别(RTI),是多种编程语言(如 C++、Object Pascal 和 Ada)的一项功能,它使得有关对象的数据类型的信息可以在运行时获取。运行时类型信息可以被制作成...
阅读 4 分钟
unordered_multimap rehash(N) 函数在 C++ 中将容器中的元素数量增加到 n 或更多。如果 n 大于容器中的元素数量,则需要重新哈希。新元素计数可能等于或大于...
阅读 3 分钟
引言:在软件开发中,设计模式为常见编程问题提供了可重用的解决方案。工厂设计模式是面向对象编程中最常用的设计模式之一。工厂设计模式提供了创建对象的接口,尽管子类……
阅读 4 分钟
C++ 标准库中用于多线程和异步编程的最有用的工具之一是 std::future。这部分对于处理异步操作和从并发运行的作业中获取输出至关重要。它包含在 C++11 并发实用程序中,提供了...
阅读 4 分钟
? 树是一种分层数据结构,由以父子关系组织的节点组成。树中的每个节点都有一个或多个子节点,并且除根节点外,每个节点都有一个父节点。根节点是树中的最高节点...
阅读 3 分钟
直方图是计算机科学中一种重要的数据结构,具有许多用途,包括数据分析和图像处理。确定直方图中的最大矩形区域是一个经常遇到的挑战。在这篇文章中,我们将研究一种使用以下方法处理此问题的快速有效方法...
阅读 4 分钟
C++ 中的 std::array::crbegin 函数是 std::array 类模板的成员函数,该类模板是标准模板库 (STL) 的一部分。此函数用于获取指向 std::array 最后一个元素的逆向迭代器。换句话说,它用于...
阅读 6 分钟
在本文中,您将学习使用不同方法和示例在 C++ 中扁平化链表。在 C++ 中扁平化链表意味着将链表(包含链表)转换为单个排序链表。这是数据结构中常见的问题...
阅读 22 分钟
计算机程序中的浮点运算通常涉及可能导致不准确性和异常情况的近似值。当执行敏感的数值计算时,这些异常可能导致不希望的程序终止或不正确的输出。C++ 编程语言提供了处理这些浮点异常的机制和用于...
阅读 6 分钟
在解决与最大子数组和相关的问题时,Kadane 算法经常成为首选解决方案。在本博客文章中,我们将探讨此问题的一个有趣变体,并确定最大的循环子数组和。我们将探讨基本概念,提供详尽的...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India