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