- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是一名经验丰富的 C 开发人员,刚刚开始接触 C++,我必须承认,我很困惑有多少种方法可以创建、保留和销毁 C++ 对象。在 C 中,生活很简单:在堆栈上分配 =
拷贝,而 malloc
/free
管理堆上的数据。 C++ 远非如此,至少在我看来是这样。
鉴于此,以下是我的问题:
T f = x
、T f(x);
、T f{x};
等有什么区别?=
是什么都是正确的,您想在什么时候使用指针?在 C 语言中,我非常习惯于在 lot 周围抛出指针,因为指针分配很便宜,但结构复制却不那么重要。 C++ 的复制语义对此有何影响?shared_ptr
、weak_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/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!