【问题标题】:Assignments are by reference?作业是通过引用?
【发布时间】:2014-10-12 06:24:34
【问题描述】:

如果你这样做,在 java 中

Myobj one = new Myobj();
Myobj two = one;

那么一和二指向同一个对象。

如果我这样做的话,在 C++ 中:

Myobj one = new Myobj();
Myobj *two = &one;

这本质上与 java 示例相同吗?其中修改onetwo会影响两个对象?

【问题讨论】:

  • 不,这不能编译:two 应该声明为Myobj*,然后只做one = two;。您还可以在 C++ 中使用引用。
  • @quantdev 好吧,我实际上并不想要one = two,但是当我初始化two 时,我希望它是one 的副本。然后我可以稍后编辑two。我做对了吗?
  • @user1008134 一个当前是空指针
  • @user1008134 您的代码甚至无法编译。您将指针分配给对象(第二行),然后甚至将指针的地址分配给已取消引用的对象(不存在,您只能取消引用指针)。
  • @Winestone 更正了,我打错了

标签: java c++ variable-assignment


【解决方案1】:

以下这些代码与 Java 相同。

Myobj one;
Myobj& two = one;

【讨论】:

    【解决方案2】:

    下面的代码使 one 和 two 指向同一个位置,即更改其中任何一个都会更改它们。

    yobj *one = new Myobj();
    Myobj *two = one;
    

    如果你想让两个成为一个的副本,那么,

    Myobj *one = new Myobj();
    Myobj *two = new Myobj();
    *two = *one;
    

    【讨论】:

      【解决方案3】:

      他们不一样!

      使用new 关键字创建的对象即使在本地范围之后仍然存在。它们在堆中分配存储。它们返回一个引用,因此您需要一个指针来存储引用值。

      创建的对象

      without new 关键字遵循复制语义。那就是如果你有

      Object obj1=Object()
      Object obj2=obj1;
      

      将创建两个对象。即 obj1 的属性值被复制到 obj2。

      如果你不想创建一个新对象,你应该使用指针。

      例如:

      Object obj1=Object()
      Object *obj1ref=&obj1;  //this is like assigning reference in java
      

      下面的语句说明了 cpp note & 在声明中的变量,一旦分配它就不能映射到任何其他对象。所以 not 太接近 Java 引用了。

      Object& ref2=obj1;      
      

      这里 obj1 的生命周期在本地范围之后结束。

      当您在 cpp 中声明为 Object obj 时,您实际上是在为一个对象分配空间,而不仅仅是在 Java 中创建引用。在CPP 中,指针最接近您在java 中所称的引用。

       Object *obj=new Object();
      

      上述语句在堆栈以外的内存中创建对象。在您使用 delete 运算符释放内存或关闭应用程序之前,它有生命周期。

      Java 中,所有对象都只在堆中创建。

      【讨论】:

        【解决方案4】:

        这些使一和二基本相同:

        Myobj *one = new Myobj();
        Myobj *two = one;
        //one and two are the same thing, pointer's to a Myobj
        
        Myobj one;
        Myobj *two = &one;
        //one is an object that will be deallocated at end of current scope
        //two is a pointer to one
        


        在 C++ 中,new Myobj() 在堆上创建一个 Myobj 并返回一个指向它的指针。

        Myobj *one; //Creates a variable that should point to a Myobj instance
        Myobj two = new Myobj(); //Doesn't really work
        *two = &one; //Get where two point's at and assign the location of one to it
        


        更新:

        Myobj one = new Myobj(); //This doesn't quite work, assigning pointer to class
        Myobj *two = &one; //This works, you make a pointer to point to one
        

        要修正您的第一条语句,您可以使用:

        Myobj one = Myobj();
        //Myobj one(); //This requires the constructor to take arguments, thanks juanchopanza!
        Myobj one{}; //Requires C++11, courtesy juanchopanza
        Myobj one;
        

        所有人都做同样的事情


        一般情况下,以下应制作副本:

        Myobj one; //or any variant
        Myobj two = one;
        

        或者如果您更喜欢使用指针:

        Myobj *one = new Myobj();
        Myobj *two = new Myobj();
        *two = *one;
        

        【讨论】:

        • 抱歉,我这个问题问得不好,但是在不使它们成为相同变量的情况下,将one 复制到two 的正确方法是什么。
        • 澄清一下,您的最后两个代码 sn-ps 创建了两个单独的对象,每个对象具有相同的内容,但修改一个或另一个不会影响另一个?
        • Myobj one(); 是一个函数声明。
        • 顺便说一句,你可以说Myobj one{};(除非坚持使用 C++11 之前的编译器。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2021-05-08
        • 1970-01-01
        相关资源
        最近更新 更多