C+中是否只有类实例指针的初始化+;? 我们都知道,C++中定义新实例最简单的方法是: ClassName *obj = new ClassName(); ClassName *obj = new ClassName();
但这样的方式是不好的,更高级的人使用智能指针,比如:C+中是否只有类实例指针的初始化+;? 我们都知道,C++中定义新实例最简单的方法是: ClassName *obj = new ClassName(); ClassName *obj = new ClassName();,c++,pointers,memory-management,reference,class-instance-variables,C++,Pointers,Memory Management,Reference,Class Instance Variables,但这样的方式是不好的,更高级的人使用智能指针,比如:shared\u ptr,unique\u ptr等等。。。但如果查看它们的源代码,您可能会发现smart_指针正在使用指针来创建新实例,而不是引用 我也知道,使用指针不仅是C++中的干净源代码(设计规则)的坏东西,而且指针也会分配新的内存,因为任何指针都是空洞*/Cux>类型。正确的大小取决于CPU体系结构,但以x86为例,它可以容纳4个字节 使用比引用和要昂贵,这不需要为它们分配任何内存,这就是为什么使用C++自定义方法中的引用是好几英里的
shared\u ptr
,unique\u ptr
等等。。。但如果查看它们的源代码,您可能会发现smart_指针正在使用指针来创建新实例,而不是引用
我也知道,使用指针不仅是C++中的干净源代码(设计规则)的坏东西,而且指针也会分配新的内存,因为任何指针都是<代码>空洞*/Cux>类型。正确的大小取决于CPU体系结构,但以x86为例,它可以容纳4个字节
<>使用比引用<代码>和<代码>要昂贵,这不需要为它们分配任何内存,这就是为什么使用C++自定义方法中的引用是好几英里的原因。 告诉你这些信息,我想知道:是否可以用C++中的引用定义新的实例?若否,原因为何
我们都知道,C++中定义新实例最简单的方法是:
ClassName *obj = new ClassName();
ClassName *obj = new ClassName();
不!创建实例的最简单方法是:
ClassName obj;
要为此初始化引用,只需说:
ClassName& objRef = obj;
或
使用引用作为函数的返回值时要小心。当函数离开其作用域时,应该确保引用的对象实例仍然存在
ClassName *obj = new ClassName();
这不是最简单的方法。这是:
ClassName obj;
既然引用是。。。引用,你必须实例化一个对象才能有一个引用
ClassName obj;
ClassName& refObj = obj;
如果没有对象引用,就无法创建您想要使用的引用。恐怕您的帖子是一个接一个的误解。所以你要做的第一件事就是扔掉所有你读过的书 现在,试着回答你的问题。不能创建“带引用”的对象。另一种方法是,您可以创建对现有对象的引用
MyClass myobject;
MyClass& myreference = myobject;
就像您可以创建指向现有对象(或不指向任何对象)的指针一样。请注意,创建对象的不是指针。新表达式的作用是:
new MyClass;
创建了一个MyClass类型的新对象“在堆上”,如果您愿意的话。但它是毫无用处的,因为你已经失去了所有的手柄。您无法访问它。这就是为什么我们将这个对象(new返回的对象)的地址存储在指针中。如果是智能指针而不是普通指针,它将根据智能指针的类型自动“知道”何时释放内存,即删除对象。也就是说,您可以创建对新创建对象的引用,而不是存储新创建对象的地址:
MyClass& ref = *new MyClass;
...
delete &ref;
引用是免费的(就内存而言),这也是不正确的。当然,sizeof(reference)将返回所引用对象的大小,但大多数实现将使用类似指针的逻辑作为引擎盖下的引用 >在C++中引用引用不是一个好主意。(我想你是说这个意思)。因为,不能通过引用将局部变量返回到函数。参考:
“…函数试图返回一个值的引用,该值在函数返回时将超出作用域。这意味着调用方将收到一个对垃圾的引用…”我认为纠正您文章中不同的错误断言是值得的(除了回答主要问题之外),这样你就能回到正确的轨道上 定义新实例的最简单方法是
a*a=newa()代码>
不,最简单的方法是A代码>
这样的方法不好,所以更高级的人使用智能指针
事实上,它不是最受推荐的。主要缺点是:
对象是在堆上分配的,这会降低访问速度
您必须自己管理内存,具体地调用delete
使用智能指针只能解决第2点。这就是为什么更高级的人实际上会在堆栈上使用尽可能多的分配,使用A代码>。然而,这并不总是可能的,在这种情况下,智能指针确实是最好的选择
但是智能指针使用的是指针,而不是引用强>
实际上,智能指针的作用只是帮助内存管理(这就是为什么头是#include
),所以它们处理堆上的对象,而不是堆栈上的对象。他们所做的是为您调用delete
,这样您就不必担心内存泄漏
指针不好,因为任何指针都是void*类型,占用内存
是的,指针在堆栈中占用N位内存(N=32或64,具体取决于您的体系结构)加上堆中对象的实际大小S。但这也是真实的参考!不同类型实体所需空间汇总:
- 指针(
A*A=newa;
):堆栈上的N位(地址)+堆上的S位(对象)
- 引用(
aa;A&ref=A;
):堆栈上的N位(地址)+堆栈上的S位(对象)
- 直接值(
A;
):堆栈(对象)上的S位
因此,从内存空间的角度来看,引用和指针是相同的,只有在堆栈上使用直接值时才有收益。请注意,实际上,引用还可以指向堆上的对象(a&ref=*newa;
),指针也可以指向堆栈上的对象(a;a*ptr=&a;
)
<强>是否可以用C++引用一个新实例?< /强> < /p>
是的:
我们都知道,C++中定义新实例最简单的方法是:
ClassName *obj = new ClassName();
ClassName *obj = new ClassName();
不,我们不。。。因为它不是
要创建类型为ClassName
的新实例,只需编写:
ClassName obj;
仅使用动态alloc
ClassName* ptr = &obj; // a pointer to obj
ClassName& ref = obj; // a reference to obj