【问题标题】:Reference to a Structure引用结构
【发布时间】:2022-01-05 01:09:53
【问题描述】:

我从一本名为 C++ Primer Plus 的书中读到这部分内容(第 400 页。第 8 章 - 函数冒险)

第二种方法是使用new 创建新存储。您已经看到new 为字符串创建空间并且函数返回指向该空间的指针的示例。 以下是你应该如何与推荐人做类似的事情:

const free_throws & clone(free_throw & ft)
{
    free_throws * ptr;
    *ptr = ft;
    return *ptr;
}

第一条语句创建了一个无名的free_throw 结构。指针ptr 指向结构,所以*ptr 就是结构。代码似乎返回了结构,但函数声明表明该函数确实返回了对该结构的引用。你可以这样使用这个函数:

free_throw & jolly = clone(three);

这使得jolly 成为对新结构的引用。这种方法存在一个问题:当不再需要内存时,您应该使用delete 来释放new 分配的内存。对clone() 的调用隐藏了对new 的调用,从而更容易忘记稍后使用删除。

我的疑惑:

据我所知,对于最佳实践,您不应该在不初始化指针的情况下取消引用指针,并且声明指向某个结构的指针只会为指针分配空间,而不是为整个结构分配空间,您必须为结构单独分配空间。 根据这本书,声明指针会自动为整个结构分配空间,并且指针在没有初始化的情况下被取消引用。 调用函数时如何自动调用new运算符?

【问题讨论】:

  • “在没有初始化的情况下永远不要取消引用指针”不仅仅是只是最佳实践——它是最佳实践完全避免使用指针 .取而代之的是 use referencessmart-pointers
  • 你的分析是正确的。 - 买一本新的/更好的书。 *ptr = ft; 是未定义的行为,因为 ptr 未初始化。
  • 添加到 Richard 的评论中,我想提一下,它也完全失败了 const 正确性,因为我们从 const free_throws& 分配了一个 free_throws&,顺便说一下,这是对临时的引用. C++ Primer Plus 是什么?那是C++ Primer 的抢钱山寨版吗?无论哪种方式,我都会改用 Lippman、Lajoie 和 Moo 所著的 C++ Primer 这样的正版书籍
  • ...更不用说它谈论new,但忘记实际使用它。

标签: c++ pointers struct reference new-operator


【解决方案1】:

据我所知,对于最佳实践,您不应该在未初始化的情况下取消引用指针

这不仅仅是“最佳做法”,而且绝对不能这样做。您绝不能通过未初始化的指针间接。

调用函数时如何自动调用new运算符?

new 运算符未被调用。


free_throws * ptr;

第一条语句创建了一个无名的 free_throw 结构。

这是完全错误的。第一条语句创建一个指针,根本没有结构的实例。引用的文本与代码不匹配。

free_throw & jolly = clone(three);

这使得 jolly 成为对新结构的引用。

这也是错误的。 clone 返回对 const 的引用,对非 const jolly 的引用不能绑定到它。此初始化格式不正确。


我会假设代码是错误的,并且打算在其中使用new,但作者忘记了。要理解的最重要的部分是在第三个引用中,它解释了函数有问题;因此,即使它被“固定”为使用new,也没有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2016-11-05
    • 2012-02-05
    • 2023-02-05
    相关资源
    最近更新 更多