gpt4 book ai didi

c++ - C++ 对象的生命周期是什么?

转载 作者:IT老高 更新时间:2023-10-28 12:43:41 30 4
gpt4 key购买 nike

我是一名经验丰富的 C 开发人员,刚刚开始接触 C++,我必须承认,我很困惑有多少种方法可以创建、保留和销毁 C++ 对象。在 C 中,生活很简单:在堆栈上分配 = 拷贝,而 malloc/free 管理堆上的数据。 C++ 远非如此,至少在我看来是这样。

鉴于此,以下是我的问题:

  1. 所有有哪些方法可以创建 C++ 对象?直接/复制构造函数、赋值等。它们是如何工作的?
  2. 与所有这些类型的对象创建相关的所有不同的初始化语法是什么? T f = xT f(x);T f{x};等有什么区别?
  3. 最重要的是,何时在 C++ 中复制/分配/无论 = 是什么都是正确的,您想在什么时候使用指针?在 C 语言中,我非常习惯于在 lot 周围抛出指针,因为指针分配很便宜,但结构复制却不那么重要。 C++ 的复制语义对此有何影响?
  4. 最后,像 shared_ptrweak_ptr 等这些都是什么?

对不起,如果这是一个有点宽泛的问题,但我对何时使用什么感到非常困惑(甚至没有提到我对集合中的内存管理和 new 运算符的困惑),我觉得我所知道的关于 C 内存管理的一切都在 C++ 中失效了。这是真的,还是我的心智模型错了?

总结一下:C++ 对象是如何创建、初始化和销毁​​的,我应该什么时候使用每种方法?

最佳答案

首先,你的内存管理技能在 C++ 中很有用,只是比 C++ 的处事方式低了一个层次,但它们是有的……

关于你的问题,它们有点宽泛,所以我会尽量简短:

1) What are all the ways to create a C++ object?

同C:它们可以是全局变量、局部自动、局部静态或动态。你可能会对构造函数感到困惑,但简单地认为每次创建对象时都会调用构造函数。总是。哪个构造函数只是创建对象时使用什么参数的问题。

Assignment 不会创建一个新对象,它只是从一个对象复制到另一个对象,(想想 memcpy 但更聪明)。

2) What are all the different initialization syntaxes associated with all these types of object creation? What's the difference between T f = x, T f(x);, T f{x};, etc.?

  • T f(x) 是经典的方式,它只是使用以 x 作为参数的构造函数创建一个 T 类型的对象.
  • T f{x} 是新的 C++11 统一语法,因为它可用于初始化聚合类型(数组等),但除此之外它等同于前者.
  • T f = x 取决于x 是否属于T 类型。如果是,则等价于前者,如果是不同类型,则等价于T f = T(x)。这并不重要,因为允许编译器优化掉多余的拷贝(复制省略)。
  • T(x)。你忘了这个。 T 类型的临时对象被创建(使用与上面相同的构造函数),它在代码中出现的任何地方使用,并且在当前完整表达式的末尾 , 它被销毁了。
  • T f。这将使用默认构造函数(如果可用)创建一个 T 类型的值。这只是一个不带参数的构造函数。
  • T f{}。默认构造,但使用新的统一语法。请注意,T f() 不是 T 类型的对象,而是返回 T! 的函数。
  • T()。使用默认构造函数的临时对象。

3) Most importantly, when is it correct to copy/assign/whatever = is in C++, and when do you want to use pointers?

您可以使用与 C 中相同的方法。将复制/分配想象成 memcpy 的位置。您也可以传递引用,但您也可以等待一段时间,直到您对这些感到满意为止。你应该做的是:不要使用指针作为辅助局部变量,而是使用引用。

4) Finally, what are all these things like shared_ptr, weak_ptr, etc.?

它们是您的 C++ 工具带中的工具。你将不得不通过经验和一些错误来学习......

  • shared_ptr在对象的所有权被共享时使用。
  • unique_ptr 在对象的所有权唯一且明确时使用。
  • weak_ptr 用于中断 shared_ptr 树中的循环。它们不会自动检测到。
  • vector 。别忘了这个!用它来创建任何东西的动态数组。

PS:你忘了问析构函数。 IMO,析构函数赋予了 C++ 个性,所以一定要大量使用它们!

关于c++ - C++ 对象的生命周期是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121305/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com