代码之家  ›  专栏  ›  技术社区  ›  GJ.

使用引用变量复制构造函数

c++
  •  1
  • GJ.  · 技术社区  · 15 年前

    我有一个如下所示的类,我想为它编写一个复制构造函数。 我需要为此创建一个深度复制构造函数。下面的代码正确地打印X和C,但这里Y的值是垃圾。

    #include "stdafx.h"
    #include <string.h>
    class MyClass
    {
    public:
    
     MyClass(int a) : y(a) {
     }
     MyClass(const MyClass &myClass) : y(myClass.y)
     {
      x = myClass.x;
      c = new char[10];
      strcpy(c, myClass.c);
     }
    
      int x;
      char *c;
      int &y;
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
     MyClass m1(0);
     m1.c = new char[10];
     strcpy(m1.c, "gourav");
     m1.x = 10;
     m1.y = m1.x;
    
     MyClass m2 = m1;
    
     printf("x=%d\nc=%s\ny=%d\n", m2.x, m2.c, m2.y);
     return 0;
    }
    
    5 回复  |  直到 11 年前
        1
  •  3
  •   Kiril Kirov    15 年前

    在您的代码中, Y 是参考。您正在创建myClass M1(0),所以m1.y指向 暂时的 变量0。你只是 不能 做这个…我不知道你为什么 Y 成员是引用..???不管怎样,如果您希望这样做,请执行以下操作:

    //..
    int a = 10;
    MyClass m1(a);
    //..
    

    不管怎样,这很难看……而且很危险,如果你不知道自己在做什么……你真的应该有一个很好的理由这样做。

    另外,重新设计类及其成员的名称。

    所以,问题根本不在复制构造函数中。

        2
  •  3
  •   asen    15 年前

    问题不是复制,而是构造函数: myclass(int a):y(a)。 这里y是一个临时变量的引用,它消失了。

        3
  •  3
  •   Flinsch    15 年前

    在第一个接受int的构造函数中,您正在引用一个临时局部变量。

        4
  •  2
  •   Prasoon Saurav    15 年前

    我不喜欢你的密码。

    其他的答案指出了为什么你得到垃圾价值。

    更好的代码版本如下所示:

    #include <iostream>
    class MyClass
    {
    
      int x;
      std::string c; //use std::string instead of char*
      int &y;
    
      public :
    
      MyClass (int a, std::string b): x(a), c(b),y(x) {}
      MyClass (const MyClass& myclass) : x (myclass.x), c(myclass.c), y(myclass.y) {}
    
      void print()
      {
         std::cout << x << " " << c << " " << y <<std::endl;
      }
    };
    
    int main()
    {
    
        MyClass m1 (10, "Gaurav");
        MyClass m2 = m1;
    
        m1.print();
        m2.print();
    }
    

    输出:

    10 Gaurav 10
    10 Gaurav 10
    
        5
  •  0
  •   Anitesh    11 年前

    在您的代码中,混淆的步骤是行: M1,y=M1.x;

    看起来y被赋予了x值,但这里没有。 实际上,您试图更改y所指变量的值。在代码中,引用的变量是一个局部临时变量,它在其作用域结束后不存在。 这就是为什么一旦控件转到copy ctor,您就会得到垃圾值。