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

时间:2010-10-19 14:49:23

标签: c++

我有一个如下所示的类,我想为它编写一个复制构造函数。 我需要为此创建一个深层复制构造函数。以下代码正确打印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 个答案:

答案 0 :(得分:3)

问题不是复制,而是构造函数: MyClass(int a):y(a){}。 这里y是对TEMPORARY变量的引用,它会消失..

答案 1 :(得分:3)

在您的代码中, y 是引用..您正在创建MyClass m1(0),因此m1.y指向临时变量 - 0。您只需一定不能这样做..我不知道为什么你 y 成员是参考.. ??无论如何,如果你想这样做,那就这样做:

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

无论如何,这很丑......如果你不知道自己在做什么,那就太危险了。你应该有充分的理由去做。

此外,重新设计您的班级及其成员的名字..

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我不喜欢你的代码。

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

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

#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

答案 4 :(得分:0)

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

看起来y被分配了值x,但这不会发生在这里。 您实际上是在尝试更改y引用的变量的值。在您的代码中,引用变量是一个本地临时变量,在其范围结束后不存在。 这就是为什么一旦控件复制ctor就会获得垃圾值。