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