c++ - 默认(可选)参数作为引用 c++

标签 c++ overloading pass-by-reference default-arguments

是否有可能(不使用 boost)在 C++ 中有一个函数如下:

void foo(int x, classX &obj = *(new classX()))

classX 在我的代码库中多次使用,并且有许多具有相似签名的此类函数(即使用此类对象作为默认参数)。是否可以在没有重载调用的情况下实现这一目标?

最佳答案

您提供的代码当然可以编译并“工作”,但我强烈建议不要这样做。

该函数返回 void,这意味着被引用或分配的对象(或其假定的所有者)不会离开该函数。因此,如果分配了它,就必须将其销毁(否则,那是其他人的问题,在该功能之外)。

然而,这甚至是不可能的,没有人拥有该对象,也没有指向它的指针!因此,您不仅可能内存泄漏,而且保证内存泄漏(以防未传递任何对象),除非您添加另一个丑陋的 hack 派生来自引用的指针仅用于销毁对象。这是非常不愉快的。

此外,即使您完成了此操作(以无泄漏的方式),每次函数调用都会进行无用的对象分配和销毁。尽管不应该过早优化,但也不不应该过早悲观地添加定期分配和释放,这不仅是不必要的,而且实际上会降低代码质量。

更好的做法是:

//namespace whatever {
classX dummy;
//}
#include <memory>

void foo(int x, classX &obj = dummy)
{
    if(std::addressof(obj) != std::addressof(dummy))
    { /* do something using object */ }
    else
    { /* no object supplied */ }
}

是的,这是一个用于公益事业的全局变量。如果让您感觉更好,您可以将全局设置为单例,或者将其设置为静态类成员,都一样。无论哪种方式,您只有一个对象,没有分配,没有泄漏,如果您愿意,您仍然可以将对象传递给函数。并且,您可以区分这两种情况。

关于c++ - 默认(可选)参数作为引用 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59299336/

相关文章:

c# - 读取 DTD 或 Schema 并列出给定元素的所有有效子元素或属性

c++ - 不同水平位置的进度条布局

java - 有人能解释一下 java 是如何仅在以下情况下按值传递的吗

c++ - QGraphicsScene - 添加带有少量不透明点的大透明像素图时,应用程序挂起很长时间

c++ - 什么是 SCARY 迭代器?

c++ - 动态转换还是函数重载?

function - 经典 asp JScript 中的重载函数

c++ - 为什么在 C++ 中调用此运算符?

Powershell [Ref] 值未更新主对象

在 C 中传递和修改 char 指针之间的混淆(引用与值)