在 C++ 中是否有通过引用返回新对象实例的正确方法?

2024-02-09

所以我正在编写一些代码,我有这样的代码:

class Box
{
    private:
    float x, y, w, h;

    public:
    //...
    Rectangle & GetRect( void ) const
    {
        return Rectangle( x, y, w, h );
    }
};

然后在一些代码中:

Rectangle rect = theBox.GetRect();

Which worked in my debug build, but in release there were "issues" returning that Rectangle by reference -- I basically got an uninitialized rectangle. The Rectangle class has an = operator and a copy constructor. Without getting into why this broke, I'm actually more interested in the correct way to return a (new) object by reference for the purpose of assigning copying to a variable. Am I just being silly? Should it not be done? I know I can return a pointer and then dereference on assignment, but I'd rather not. Some part of me feels like returning by value would result in redundant copying of the object -- does the compiler figure that out and optimize it?

这似乎是一个微不足道的问题。经过多年的 C++ 编码,我不知道这一点,我感到几乎尴尬,所以希望有人能为我解决这个问题。 :)


您无法返回对堆栈上临时对象的引用。您有三个选择:

  1. 按值返回
  2. 通过指针通过引用返回到您使用 new 运算符在堆上创建的内容。
  3. 通过引用返回您通过引用收到的参数。 [编辑:感谢@harshath.jr 指出了这一点]

请注意,当您按值返回(如下面的代码所示)时,编译器应优化分配以避免复制 - 即,它将通过将 create+assign+copy 优化为 create 来创建单个矩形(矩形)。仅当您从函数返回时创建新对象时,这才有效。

Rectangle GetRect( void ) const
{
    return Rectangle( x, y, w, h );
}

Rectangle rect = theBox.GetRect();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中是否有通过引用返回新对象实例的正确方法? 的相关文章

随机推荐

  • 如何动态修改Android布局XML

    我是 Android 开发新手 我将开发一个 Android 应用程序 在此应用程序中 我想动态生成 xml 布局 登录应用程序后 服务器将发送带有控件描述的 xml 模板 其中包括不同的属性描述 每个控件的验证 最大长度 控件的大小等 这
  • os Catalina 和 Laravel Homestead MySql 错误:ERROR 2007 (HY000):协议不匹配;服务器版本 = 11,客户端版本 = 10

    我正在尝试连接到MySQLVagrant 版本中的服务器Laravel Homestead 运行MySQL 5 7 我似乎从来没有遇到过任何问题 但在装有 Catalina 的新笔记本电脑上 尝试使用推荐设置进行连接时出现以下错误 mysq
  • 从 MailItem (Microsoft.Office.Interop.Outlook) 获取唯一 ID?

    我正在创建一个应用程序来读取 Outlook 中收到的电子邮件 读取的过程大概是这样的 using Outlook Microsoft Office Interop Outlook var app new Outlook Applicati
  • 类似于 Bitbucket 的软件,我可以自行托管

    是否有类似于 Bitbucket 的系统可供我自行托管 我试图在网上四处看看是否有什么东西 但我似乎找不到任何东西 我们现在正在使用Redmine 但Redmine不支持每个项目多个存储库 我希望能够实现的 Bitbucket 功能包括分叉
  • 公共/受保护的类属性不会覆盖父类的私有属性吗?

    在父类上声明私有属性 然后在子类上将该属性重新声明为公共属性或受保护属性 当您创建 Child 类的实例并调用从 Parent 类继承的方法时 使用 Parent 类上的属性 而不是 Child 类上的属性 如果父类上的属性的初始声明是公共
  • 如何在 TinyMCE for Plone 中将 替换为

    我想在 TinyMCE 中用强标签替换粗体标签 如何在 Plone 中使用 Products TinyMCE 做到这一点 我读了TinyMCE文档 http www tinymce com wiki php Configuration va
  • 计算表结果:使用单选按钮值的 PHP switch case

    我编辑了这篇文章以便更好地理解 这是我作为学生实习生的第一个项目 它是一个记录计算机设备的设备监控系统 这是页面中的代码的一部分 该页面包含过滤选项和显示计算机设备列表的表格 过滤选项包含几个单选按钮 它们属于两个类别 状态 和 条件 请参
  • jQuery 连续鼠标按下

    我有以下代码片段 document mousedown function event doSomething 我可以捕获mousedown活动成功 我正在尝试执行以下操作 捕捉第一个mousedown event 我想检测用户是否仍然按住鼠
  • 如何在 C 中使用 printf 打印 unsigned long int ? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在C中打印 unsigned long https stackoverflow com questions 3209909 how to printf unsigned long in gcc 我
  • 为什么我的愿望清单仅限于一项?

    我使用magento 1 9 我的愿望清单有问题 出于某种原因 它只会让我在我的愿望清单中包含一个项目 当我将另一个项目添加到愿望清单时 它会替换我的愿望清单中已有的项目 有配置中没有任何内容来限制愿望清单项目 我只是有点困惑为什么要这样做
  • 如何将 POST 请求重定向到在 MVC 中维护模型值的 url

    我有一个相当标准的排序 过滤器 页面搜索表单 但需要控制 url 的格式 排序 过滤器 页面参数都应该是 url 的一部分 以便可以将地址通过电子邮件发送给某人 当添加另一个过滤器参数时 会发出 POST 请求 我的控制器方法如下所示 Ht
  • RecyclerView 与 ImageView 以及不同的 Activity

    我拥有的 一个 RecyclerView 其中包含酒吧 咖啡店等地方的图片 我想要的 当您单击这些图像之一时 我会向您显示所选地点的信息 我的问题 我该如何设置OnCLickListener例如第三张图片 很多人告诉我在我的 onBindV
  • 如何在matplotlib条形图后面绘制网格线

    x 01 02 02 02 03 02 04 02 05 02 y 2 2 3 7 2 fig ax plt subplots 1 1 ax bar range len y y width 0 3 align center color sk
  • .htaccess 将所有内容重写到父目录

    我正在尝试重写对父目录的每个请求 这是我的 htaccess 的内容 RewriteEngine on RewriteRule 1 不幸的是 这不起作用并导致 错误请求 错误 这可能吗 应该夹在 之间 这样系统就知道它应该将表达式 记忆 为
  • Visual Studio 2017 控制台应用程序:预编译头

    最近我更新了我的 Visual Studio 2017 从那时起 我无法创建 Windows 控制台应用程序项目 文件 新建 项目 我选择了 已安装 Visual C Windows控制台应用程序 当我单击 确定 时 没有出现应用程序设置向
  • 将自定义变量/参数从电子邮件模板传递到 phtml 文件

    我被困在我的自定义代码中 我想将自定义变量从电子邮件模板传递到 pthml 文件 编辑文件 应用程序 代码 本地 法师 销售 模型 Order php 在这个函数中 public function sendNewOrderEmail def
  • linux inotify 事件用于重命名()并覆盖

    我有一个小型应用程序 它监视目录树中特定类型的文件名 monitored 它统计匹配文件的数量 使用 inotify 监视添加或删除匹配文件的各种事件 并可以轮询报告当前文件数量 以及过去几年添加和删除文件的平均速率秒 目录树可以包含数十万
  • 为开源贡献内部工具值得付出努力吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道这是一个普遍问题 但我想听听其他人对我们案例的看法 我在一家小公司工作 我们的主要开发工具是 PowerBuilder 这是一个非常有限的
  • OpenCV 的 .Net (dotNet) 包装器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我见过有几个 opencvdotnet http code google com p opencvdo
  • 在 C++ 中是否有通过引用返回新对象实例的正确方法?

    所以我正在编写一些代码 我有这样的代码 class Box private float x y w h public Rectangle GetRect void const return Rectangle x y w h 然后在一些代码
Powered by Hwhale